2017-05-04 11 views
0

好奇心のためだけ... pythonの "変数"はオブジェクトへの参照です。それぞれという名前のまたは「アクセサーラベル」があるので、スクリプト作成中にそれらを参照できます。同じオブジェクトを指すすべての変数(参照名)を取得する

各Pythonオブジェクトは、それ自身を参照するすべての「変数名」のリストを保持していますか?どうすればそれにアクセスできますか?

# A random object 
class A(object): 
    pass 

# references to instances 
a = A() 
b = A() 
c = a 

# I happen to come accross one reference 
ref = c 

# This is how I find all the ways I can access it 
# i.e. all its "accessers" or "variable names" 
k, v = None, None # to avoid `RuntimeError: dictionary changed size..` 
for k, v in globals().items(): 
    if v is ref: 
     print(k) # prints "a c ref" since `a is c` and `c is ref` 

# Is there a way I may get this without looping over all variables? Like a.. 
ref.__getallreferencenames__() # AttributeError 
# Is that information stored and kept up to date somewhere? 

答えて

0

では、Pythonのvarnamesとオブジェクトは全く異なるものです。まずは、ヒープメモリ内の実際のオブジェクトである2番目のスコープ(ローカルまたはグローバルなど)に対応するハッシュマップのキーだけです。それがあなたの質問には意味がないと言われています。何あなたがが行うことができますが、GCモジュール自体からの低レベルの参照を取得することで、ちょうどそれを言った、例えば

c.get_referrers(object) 
+0

まあ、gc.get_referrers(このmyobj)を呼び出し、質問はに変換:1つの実際のオブジェクトを考えますヒープ、どのように私はそれにつながるすべてのvarnamesと対応するスコープを取得するのですか? 'gc.get_referrers(ref)'を使うと、期待した '['a'、 'c'、 'ref']'よりも多くのことができます。 –

+1

はい、これ以上あります)スコープは一般的に特定のコードオブジェクトの実行時にしか利用できないため、 'gc.get_referrers(ref)'は 'object-> scope'関係ではなく、オブジェクトのリストを提供しますフレームオブジェクトにバインドされます)。つまり、オブジェクトとスコープは完全に異なる獣です。一方、マッピングとしてスコープを指定すると、そのスコープ内でオブジェクトをルックアップできますが、このスコープは実行時にのみ存在するため、スコープを最初に指定する必要があります。 –

関連する問題