İki değişkenin aynı nesneye başvurup başvurmadığı nasıl kontrol edilir?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
İki değişkenin aynı nesneye başvurup başvurmadığı nasıl kontrol edilir?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Yanıtlar:
Yani neyi en isiçindir: x is ydöner Trueeğer xve yaynı nesne bulunmaktadır.
x is zdöner False. Ancak, x ve z'ye listeler yerine (örneğin x, z = 13, 13) aynı değerler atanırsa x is zgeri döner True. Neden?
xve znoktaya ayırır. Küçük tamsayılar sık sık başarısız olduğu için (hata değeri olarak -1, bir şeyi gerçekten indekslediğinizde 0, küçük sayılar genellikle makul varsayılan değerlerdir) Python, küçük sayıları (-5 ila 256) önceden tahsis ederek optimize eder ve aynı tamsayı nesnesini yeniden kullanır. Dolayısıyla, örneğiniz yalnızca bu aralıktaki sayılar için işe yarar. Daha büyük bir şey atamayı deneyin, yani 270. Daha fazla bilgi için buraya bakın
isiki adın aynı bellek konumuna başvurup başvurmadığını kontrol eder. Nesnenin kendisiyle hiçbir ilgisi yoktur. Eşit olan ancak aynı konumda depolanmayan dizeler gibi değişmez nesnelere sahip olmak kolaydır, örneğin ''a'*10000 is 'a' * 10000False.
"af" is "af"ya da () is ()... neden aynı hafıza konumunu paylaşıyorlar?
y is xolacak True, y is zolacak False.
Her bir değişken adının hangi benzersiz nesneyi ifade ettiğini kontrol etmek için id () öğesini de kullanabilirsiniz .
In [1]: x1, x2 = 'foo', 'foo'
In [2]: x1 == x2
Out[2]: True
In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)
In [4]: x2 = 'foobar'[0:3]
In [5]: x2
Out[5]: 'foo'
In [6]: x1 == x2
Out[6]: True
In [7]: x1 is x2
Out[7]: False
In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
İki doğru çözümler iken x is zve id(x) == id(z)önceden gönderilmiş, Python bir uygulama detay işaret etmek istiyorum. Python tam sayıları nesneler olarak depolar, bir optimizasyon olarak başlangıcında (-5 ila 256) bir grup küçük tam sayı üretir ve bu önceden başlatılmış nesnelere küçük bir değere sahip bir tam sayı tutan HER değişkene işaret eder. Daha fazla bilgi
Bu, aynı küçük sayılarla (-5 ila 256) başlatılan tamsayı nesneler için, iki nesnenin aynı olup olmadığını kontrol etmenin doğru döneceği anlamına gelir ( C-Pyhon , bildiğim kadarıyla bu bir uygulama ayrıntısıdır ), oysa daha büyük sayılar bu yalnızca bir nesne diğerinden başlatılırsa doğru döndürür.
> i = 13
> j = 13
> i is j
True
> a = 280
> b = 280
> a is b
False
> a = b
> a
280
> a is b
True
Görsel bir geri bildirim almayı gerçekten çok seviyorum, bu yüzden bazen belleğin nasıl tahsis edildiğini ve neyin neye atıfta bulunduğunu görmek için http://www.pythontutor.com/visualize.html#mode=edit'i açıyorum .
Bu yanıt görselleştirmekle ilgili olduğu için bu harika gif eklendi ..
Bu docs.python.org'dan: "Her nesnenin bir kimliği, bir türü ve bir değeri vardır. Bir nesnenin kimliği bir kez oluşturulduktan sonra asla değişmez; onu nesnenin bellekteki adresi olarak düşünebilirsiniz." İs "operatörü iki nesnenin kimliğini karşılaştırır; id () işlevi, kimliğini temsil eden bir tamsayı döndürür. "
Görünüşe göre, değeri her değiştirdiğinizde, nesne, kimlik değişikliğinin gösterdiği gibi yeniden oluşturulur. X = 3 ve ardından x = 3.14 satırı hata vermez ve x için farklı kimlikler, türler ve değerler verir.
xa, adı tanımlayıcı bir nesne , bir ile değer arasında 3değil, bir nesnenin kendisi. Eğer ne zaman x=3.14, sen değişmedi nesneyi önceden tespit edilmiş x- hangi değişti nesne adı x atıfta bulundu.