Если вы переходите на Python с языка в каталоге C / Java / etc. семье, это может помочь вам перестать думать о ней aкак о «переменной» и начать думать о ней как о «имени».
a,, bи cне разные переменные с равными значениями; это разные имена для одного и того же значения. У переменных есть типы, идентификаторы, адреса и тому подобное.
В именах ничего этого нет. Значения делать, конечно же , и вы можете иметь много имен для того же значения.
Если вы дадите Notorious B.I.G.хот-дог * Biggie Smallsи Chris Wallaceсъедите хот-дог. Если вы измените первый элемент aна 1, первые элементы bи cравны 1.
Если вы хотите узнать, называют ли два имени один и тот же объект, используйте isоператор:
>>> a=b=c=[0,3,5]
>>> a is b
True
Затем вы спрашиваете:
чем отличается от этого?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Здесь вы повторно связываете имя eсо значением 4. Это никак не влияет на имена dи fникоим образом.
В своей предыдущей версии вы назначали a[0], а не a. Итак, с точки зрения a[0], вы перепривязываете a[0], но с точки зрения a, вы меняете его на месте.
Вы можете использовать idфункцию, которая дает вам некоторый уникальный номер, представляющий личность объекта, чтобы точно узнать, какой объект является каким, даже если он isне может помочь:
>>> 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 на 4297261216 - теперь это имя для другого значения. И b[0]теперь это имя того же нового значения. Это потому, что aи bвсе еще называют один и тот же объект.
По a[0]=1сути, это вызов метода для объекта списка. (Это эквивалентно a.__setitem__(0, 1).) Итак, на самом деле это вообще ничего не связывает. Это похоже на звонок my_object.set_something(1). Конечно, вероятно, объект повторно связывает атрибут экземпляра, чтобы реализовать этот метод, но не это важно; важно то, что вы ничего не назначаете, вы просто мутируете объект. То же самое и с a[0]=1.
user570826 спросил:
Что, если у нас есть a = b = c = 10
Это точно такая же ситуация, как a = b = c = [1, 2, 3]: у вас есть три имени для одного и того же значения.
Но в этом случае значение равно an int, а ints неизменяемы. В любом случае, вы можете переназначить aна другое значение (например, a = "Now I'm a string!"), но не влияет на исходное значение, которое bи cбудет по- прежнему быть имена. Разница заключается в том, что со списком, вы можете изменить значение [1, 2, 3]в [1, 2, 3, 4]практической деятельности, например, a.append(4); поскольку это фактически изменяет значение, для которого bи cявляются именами, bтеперь будет b [1, 2, 3, 4]. Невозможно изменить значение 10на что-нибудь другое. 1010 лет навсегда, точно так же, как вампир Клаудии навсегда исполнилось 5 лет (по крайней мере, пока ее не заменила Кирстен Данст).
* Предупреждение: не давайте Notorious BIG хот-дог. Зомби из гангста-рэпа нельзя кормить после полуночи.
a,bиc,на все это указывает на то же значение (в данном случае список), или вы хотитеa=0,b=3иc=5. В таком случае ты хочешьa,b,c = [0,3,5]или простоa,b,c = 0,3,5.