Python'a C / Java / vb. Bir dilden geliyorsanız. aile, a
bir "değişken" olarak düşünmeyi bırakmanıza ve onu bir "isim" olarak düşünmeye başlamanıza yardımcı olabilir .
a
, b
Vec
eşit değerlere sahip farklı değişkenler değildir; aynı değer için farklı isimler. Değişkenlerin türleri, kimlikleri, adresleri ve bunun gibi her türlü şeyi vardır.
İsimler bunlardan hiçbirine sahip değil. Değerler elbette var ve aynı değer için birçok isme sahip olabilirsiniz.
Notorious B.I.G.
Sosisli sandviç verirseniz * Biggie Smalls
ve Chris Wallace
sosisli sandviçiniz varsa. Öğesinin ilk öğesini a
1 olarak değiştirirseniz, öğesinin ilk öğeleri b
ve c
1 olur.
İki adın aynı nesneyi adlandırıp adlandırmadığını öğrenmek istiyorsanız, is
operatörü kullanın :
>>> a=b=c=[0,3,5]
>>> a is b
True
Sonra soruyorsun:
bundan farklı olan nedir?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Burada, adı e
değere yeniden bağlıyorsunuz 4
. Bu isimleri etkilemez d
vef
hiçbir şekilde .
Önceki sürümde, atama edildi a[0]
, değil a
. Yani, bakış açısından a[0]
, yeniden bağlanıyorsun a[0]
, ama bakış açısından a
, onu yerinde değiştiriyorsun.
Size id
bir nesnenin kimliğini temsil eden benzersiz bir sayı veren işlevi, is
yardımcı olamadığınızda bile tam olarak hangi nesnenin olduğunu görmek için kullanabilirsiniz:
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
a[0]
4297261120'den 4297261216'ya değiştiğine dikkat edin — artık farklı bir değer için bir ad. Ve b[0]
şimdi aynı yeni değer için bir isim. Çünkü a
ve b
hala aynı nesneyi adlandırıyorlar.
Kapakların altında a[0]=1
, aslında liste nesnesinde bir yöntem çağırıyor. ( Eşittir a.__setitem__(0, 1)
.) Yani, gerçekten hiçbir şeyi yeniden bağlamıyor. Aramak gibi my_object.set_something(1)
. Elbette, muhtemelen nesne bu yöntemi uygulamak için bir örnek özniteliğini yeniden bağlamaktadır, ancak önemli olan bu değildir; önemli olan hiçbir şey atamamanız, sadece nesneyi değiştirmenizdir. Ve ile aynı a[0]=1
.
user570826 sordu:
Ya sahipsek a = b = c = 10
Bu tamamen aynı durum a = b = c = [1, 2, 3]
: aynı değer için üç adınız var.
Ancak bu durumda, değer an'dır int
ve int
s değişmezdir. Her iki durumda da, a
farklı bir değere (örneğin a = "Now I'm a string!"
) yeniden bağlanabilirsiniz , ancak bu, orijinal değeri etkilemez.b
ve c
hala için isimler olacak. Aradaki fark, bir listeyle değeri [1, 2, 3]
olarak değiştirebilmenizdir [1, 2, 3, 4]
, örneğin a.append(4)
; çünkü bu aslında b
ve c
isimleri olan değeri değiştiriyor, b
şimdi b olacaktır [1, 2, 3, 4]
. Değeri 10
başka bir şeye değiştirmenin bir yolu yok. 10
sonsuza kadar 10, tıpkı Claudia gibi, vampir sonsuza kadar 5 yaşında (en azından onun yerine Kirsten Dunst gelene kadar).
* Uyarı: Notorious BIG sosisli sandviç vermeyin. Gangsta rap zombileri asla gece yarısından sonra beslenmemelidir.
a
,b
vec,
(bu durumda bir liste) aynı değere tüm noktasına veya istediğiniz yapmaka=0
,b=3
vec=5
. Bu durumda ister istersina,b,c = [0,3,5]
ister sadecea,b,c = 0,3,5
.