Rob'un cevabı (en çok yukarıda oylanan) doğru. Nesnelerin karşılaştırılmasına ve hangi nesnelerin sizin nesnelerinize atıfta bulunduğunu bulmaya izin verdiği için bazı durumlarda kimlik kullanmanın yararlı olduğunu eklemek isterim.
Daha sonra genellikle, örneğin sınıfları söylemek için değişken nesnelerin parametre olarak iletildiği ve bir sınıftaki yerel değişkenlere atandığı garip hataların hatalarını ayıklamanıza yardımcı olur. Bu nesneleri değiştirmek, bir sınıftaki değişkenleri değiştirecektir. Bu, birden fazla şeyin aynı anda değiştiği garip davranışta kendini gösterir.
Son zamanlarda, bir metin giriş alanındaki metni düzenlemenin, yazdığım sırada metni değiştirdiği bir Python / Tkinter uygulamasında bu sorunu yaşadım :)
İşte bu referansların nerede olduğunu izlemek için id () işlevini nasıl kullanabileceğinize dair bir örnek. Elbette bu, tüm olası durumları kapsayan bir çözüm değil, ancak fikri anladınız. Yine kimlikler arka planda kullanılır ve kullanıcı bunları görmez:
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()) )
ÇIKTI:
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'}
Değişken adlarındaki alt çizgiler, ad çakışmalarını önlemek için kullanılır. İşlevler "nereden" argümanını kullanır, böylece onlara referans aramaya nereden başlayacaklarını bildirebilirsiniz. Bu bağımsız değişken, belirli bir ad alanındaki tüm adları listeleyen bir işlev tarafından doldurulur. Globals () böyle bir işlevdir.