Jeśli przychodzisz do Pythona z języka w C / Java / etc. rodzina, może pomóc ci przestać myśleć o niej ajako o „zmiennej” i zacząć o niej myśleć jak o „imieniu”.
a, bi cnie są różnymi zmiennymi o równych wartościach; są to różne nazwy tej samej identycznej wartości. Zmienne mają typy, tożsamości, adresy i wszelkiego rodzaju tego typu rzeczy.
Nazwy tego nie mają. Wartości oczywiście mają i możesz mieć wiele nazw dla tej samej wartości.
Jeśli dajesz Notorious B.I.G.hot doga * Biggie Smallsi Chris Wallacemasz hot doga. Jeśli zmienisz pierwszy element ana 1, pierwsze elementy bi cbędą miały wartość 1.
Jeśli chcesz wiedzieć, czy dwie nazwy nazywają ten sam obiekt, użyj isoperatora:
>>> a=b=c=[0,3,5]
>>> a is b
True
Następnie pytasz:
co się od tego różni?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Tutaj ponownie wiążesz nazwę ez wartością 4. To nie ma wpływu na nazwy di fw żaden sposób.
W poprzedniej wersji przypisywałeś do a[0], a nie do a. Więc z punktu widzenia a[0], ponownie wiążesz a[0], ale z punktu widzenia azmieniasz to na miejscu.
Możesz użyć idfunkcji, która daje ci unikalny numer reprezentujący tożsamość obiektu, aby zobaczyć dokładnie, który obiekt jest którym, nawet jeśli isnie możesz 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
Zauważ, że a[0]zmieniło się z 4297261120 na 4297261216 - jest to teraz nazwa innej wartości. A b[0]teraz jest to również nazwa tej samej nowej wartości. To dlatego, że ai bnadal nazywania tego samego obiektu.
Pod okładkami a[0]=1faktycznie wywołuje metodę z obiektu listy. (Jest to równoważne a.__setitem__(0, 1).) Więc tak naprawdę nie jest to wcale ponowne wiązanie. To jak dzwonienie my_object.set_something(1). Oczywiście, prawdopodobnie obiekt ponownie wiąże atrybut instancji w celu zaimplementowania tej metody, ale nie to jest ważne; ważne jest to, że niczego nie przypisujesz, po prostu mutujesz obiekt. To samo dotyczy a[0]=1.
user570826 zadał pytanie:
Co jeśli mamy a = b = c = 10
To dokładnie ta sama sytuacja, co a = b = c = [1, 2, 3]: masz trzy nazwy dla tej samej wartości.
Ale w tym przypadku wartość to an int, a ints są niezmienne. W obu przypadkach możesz aponownie przypisać inną wartość (np. a = "Now I'm a string!"), Ale nie wpłynie to na oryginalną wartość, która bi cnadal będzie nazwami. Różnica polega na tym, że w przypadku listy możesz zmienić wartość [1, 2, 3]na [1, 2, 3, 4], wykonując np a.append(4).; ponieważ to faktycznie zmienia wartość, która bi csą nazwami, bteraz będzie b [1, 2, 3, 4]. Nie ma sposobu, aby zmienić wartość 10na cokolwiek innego. 10ma 10 na zawsze, tak jak wampirzyca Claudia ma 5 na zawsze (przynajmniej do czasu zastąpienia jej przez Kirsten Dunst).
* Ostrzeżenie: nie podawaj Notorious BIG hot doga. Zombie gangsta rapu nigdy nie powinny być karmione po północy.
a,bic,aby wszystko wskazuje na tę samą wartość (w tym przypadku lista), czy chcesza=0,b=3ic=5. W takim razie chcesza,b,c = [0,3,5]lub po prostua,b,c = 0,3,5.