Jeśli idziesz do Pythona z języka C/Java/itp. rodzina, może pomóc przestać myśleć o a
jako "zmiennej" i zacząć myśleć o niej jako o "nazwie".
a
, i c
nie są różnymi zmiennymi o równych wartościach; są to różne nazwy dla identycznej wartości. Zmienne mają typy, tożsamości, adresy i wszelkiego rodzaju podobne rzeczy.
Nazwy nie mają tego. Wartości, oczywiście, i można mieć wiele nazw dla tej samej wartości.
Jeśli podasz Notorious B.I.G.
hot dog, * Biggie Smalls
i Chris Wallace
mają hot doga. Jeśli pierwszy element a
zmienić na 1, pierwsze elementy b
i c
są 1.
Jeśli chcesz wiedzieć, czy dwie nazwy są nazywanie tego samego obiektu, należy użyć operatora is
:
>>> a=b=c=[0,3,5]
>>> a is b
True
wtedy zapytać:
co różni się od tego?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Tutaj jesteś ponownego wiązania nazwę e
wartości 4
. To w żaden sposób nie wpływa na nazwy d
i f
.
W poprzedniej wersji przypisano numer a[0]
, a nie a
. Tak więc, z punktu widzenia a[0]
, ponownie wiążisz a[0]
, ale z punktu widzenia a
, zmieniasz to w miejscu.
Można użyć funkcji id
, co daje pewną unikalną liczbę reprezentującą tożsamość obiektu, aby zobaczyć dokładnie, który to przedmiot, który nawet gdy is
nie może pomóc:
>>> 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
Uwaga, a[0]
ma zmieniono z 4297261120 na 4297261216 - teraz jest to nazwa dla innej wartości. I b[0]
jest teraz również nazwą dla tej samej nowej wartości. To dlatego, że a
i b
wciąż nazywają ten sam obiekt.
Pod pokrywami, a[0]=1
faktycznie wywołuje metodę na obiekcie listy. (Jest to odpowiednik a.__setitem__(0, 1)
.) Tak więc, nie jest to w żaden sposób ponowne wiązanie. To tak, jakby dzwonić pod numer my_object.set_something(1)
. Jasne, prawdopodobnie obiekt ponownie przypisuje atrybut instancji w celu implementacji tej metody, ale to nie jest ważne; ważne jest to, że nic nie przypisujesz, tylko mutujesz obiekt. I tak samo jest z a[0]=1
.
user570826 zapytał:
Co jeśli mamy, a = b = c = 10
To jest dokładnie taka sama sytuacja jak a = b = c = [1, 2, 3]
: masz trzy nazwy dla tej samej wartości.
Ale w tym przypadku wartość to int
, a int
s są niezmienne. W obu przypadkach można ponownie powiązać a
z inną wartością (np. a = "Now I'm a string!"
), ale nie wpłynie to na oryginalną wartość, która nadal będzie oznaczać nazwy dla b
i c
. Różnica polega na tym, że z listą można zmienić wartość [1, 2, 3]
na [1, 2, 3, 4]
, wykonując np. a.append(4)
; ponieważ to faktycznie zmienia wartość, b
i c
są nazwami, b
będzie teraz b [1, 2, 3, 4]
. Nie ma sposobu, aby zmienić wartość 10
na cokolwiek innego. 10
ma 10 lat, tak jak Claudia, wampir ma 5 lat (przynajmniej dopóki nie zostanie zastąpiona przez Kirsten Dunst).
* Ostrzeżenie: Nie podawaj Notorious B.I.G. Hot dog. Zombie z gatunku Gangsta rap nie powinny być karmione po północy.
Czy chcesz, aby 'a',' b' i 'c,' do wszystkich wskazywało tę samą wartość (w tym przypadku listę), czy też chcesz 'a = 0',' b = 3', oraz 'c = 5'. W takim przypadku potrzebujesz 'a, b, c = [0,3,5]' lub po prostu 'a, b, c = 0,3,5'. – chepner