ロブの答え(上で最も投票された)は正しいです。オブジェクトを比較し、どのオブジェクトがあなたのオブジェクトを参照しているかを見つけることができるので、場合によっては ID を使用すると便利です。
後者は通常、たとえば、変更可能なオブジェクトがパラメーターとしてクラスに渡され、クラスのローカル変数に割り当てられるという奇妙なバグをデバッグするのに役立ちます。これらのオブジェクトを変更すると、クラス内の変数が変更されます。これは、複数のものが同時に変化するという奇妙な動作に現れます。
最近、あるテキスト入力フィールドでテキストを編集すると、入力したときに別のテキストが変更されるPython/Tkinterアプリでこの問題が発生しました:)
関数 id() を使用してこれらの参照がどこにあるかを追跡する方法の例を次に示します。どうしても、これは考えられるすべてのケースをカバーする解決策ではありませんが、アイデアは得られます。ここでも ID はバックグラウンドで使用され、ユーザーには表示されません。
class democlass:
classvar = 24
def __init__(self, var):
self.instancevar1 = var
self.instancevar2 = 42
def whoreferencesmylocalvars(self, fromwhere):
return {__l__: {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
}
for __l__ in dir(self)
if not callable(getattr(self, __l__)) and __l__[-1] != '_'
}
def whoreferencesthisclassinstance(self, fromwhere):
return {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(self)
}
a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2
print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
出力:
My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}
変数名のアンダースコアは、名前の衝突を防ぐために使用されます。関数は「fromwhere」引数を使用して、参照の検索を開始する場所を関数に知らせることができます。この引数は、指定されたネームスペース内のすべての名前をリストする関数によって埋められます。Globals() はそのような関数の 1 つです。