Buradaki yorumlarda ve çift olarak işaretlenen diğer iki sorudaki kişilerin hepsi aynı şekilde bu konuda kafaları karışmış göründüğünden, Alex Coventry'nin üzerine ek bir cevap eklemeye değer olduğunu düşünüyorum .
Alex'in bir liste gibi değişebilir bir tipte bir değer ataması gerçeğinin, şeylerin paylaşılıp paylaşılmadığıyla hiçbir ilgisi yoktur. Bunu id
işlev veya is
operatörle görebiliriz:
>>> class A: foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
True
>>> class A:
... def __init__(self): self.foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
False
( object()
Diyelim ki, bunun yerine neden kullandığımı merak ediyorsanız 5
, bu, burada girmek istemediğim diğer iki konuyla karşılaşmaktan kaçınmak içindir; iki farklı nedenden dolayı, tamamen ayrı olarak oluşturulmuş 5
s, sayının aynı örneği 5
. Ancak tamamen ayrı olarak oluşturulmuş object()
URL'ler olamaz.)
Öyleyse, neden a.foo.append(5)
Alex'in örneğinde etkiliyor b.foo
, ama a.foo = 5
benim örneğimde etkilemiyor? Peki, a.foo = 5
Alex'in örneğini deneyin ve b.foo
orayı da etkilemediğine dikkat edin .
a.foo = 5
sadece a.foo
bir isim yapmaktır 5
. Bu b.foo
, ya da a.foo
atıfta bulunmak için kullanılan eski değer için başka herhangi bir adı etkilemez . * Bir sınıf özelliğini gizleyen bir örnek niteliği oluşturmamız biraz yanıltıcı olabilir, ** ancak bunu aldığınızda hiçbir şey karmaşık değildir burada oluyor.
Umarım Alex'in neden bir liste kullandığı artık açıktır: bir listeyi değiştirebilmeniz gerçeği, iki değişkenin aynı listeyi adlandırdığını göstermenin daha kolay olduğu anlamına gelir ve aynı zamanda gerçek hayat kodunda iki listeniz olup olmadığını bilmenin daha önemli olduğu anlamına gelir. aynı liste için iki isim.
* C ++ gibi bir dilden gelen insanlar için kafa karışıklığı, Python'da değerlerin değişkenlerde depolanmamasıdır. Değerler değer topraklarında kendi başlarına yaşarlar, değişkenler sadece değerlerin isimleridir ve atama sadece bir değer için yeni bir ad oluşturur. Yardımcı olacaksa, her Python değişkenini a shared_ptr<T>
yerine bir T
.
** Bazı insanlar, örneklerin ayarlayabileceği veya ayarlayamayacağı bir örnek özelliği için "varsayılan değer" olarak bir sınıf özelliğini kullanarak bundan yararlanır. Bu bazı durumlarda faydalı olabilir, ancak kafa karıştırıcı da olabilir, bu yüzden dikkatli olun.