ロブの答え(上で最も投票された)は正しいです。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つです。