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?
まあ、gc.get_referrers(このmyobj)を呼び出し、質問はに変換:1つの実際のオブジェクトを考えますヒープ、どのように私はそれにつながるすべてのvarnamesと対応するスコープを取得するのですか? 'gc.get_referrers(ref)'を使うと、期待した '['a'、 'c'、 'ref']'よりも多くのことができます。 –
はい、これ以上あります)スコープは一般的に特定のコードオブジェクトの実行時にしか利用できないため、 'gc.get_referrers(ref)'は 'object-> scope'関係ではなく、オブジェクトのリストを提供しますフレームオブジェクトにバインドされます)。つまり、オブジェクトとスコープは完全に異なる獣です。一方、マッピングとしてスコープを指定すると、そのスコープ内でオブジェクトをルックアップできますが、このスコープは実行時にのみ存在するため、スコープを最初に指定する必要があります。 –