Jawaban Rob (paling banyak dipilih di atas) benar. Saya ingin menambahkan bahwa dalam beberapa situasi menggunakan ID berguna karena memungkinkan untuk perbandingan objek dan menemukan objek mana yang merujuk ke objek Anda.
Nanti biasanya membantu Anda misalnya untuk men-debug bug aneh di mana objek yang bisa berubah diteruskan sebagai parameter untuk mengatakan kelas dan ditugaskan ke vars lokal di kelas. Mutasi objek tersebut akan mengubah vars di kelas. Ini memanifestasikan dirinya dalam perilaku aneh di mana banyak hal berubah pada saat bersamaan.
Baru-baru ini saya mengalami masalah ini dengan aplikasi Python / Tkinter di mana pengeditan teks dalam satu bidang entri teks mengubah teks di bidang lain saat saya mengetik :)
Berikut adalah contoh bagaimana Anda dapat menggunakan function id () untuk melacak di mana referensi tersebut berada. Dengan segala cara ini bukanlah solusi yang mencakup semua kasus yang mungkin, tetapi Anda mengerti. Sekali lagi ID digunakan di latar belakang dan pengguna tidak melihatnya:
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()) )
KELUARAN:
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'}
Garis bawah pada nama variabel digunakan untuk mencegah perselisihan nama. Fungsi menggunakan argumen "dari mana" sehingga Anda dapat memberi tahu mereka di mana harus mulai mencari referensi. Argumen ini diisi oleh fungsi yang mencantumkan semua nama dalam namespace tertentu. Globals () adalah salah satu fungsinya.