Если вы переходите на 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
, а int
s неизменяемы. В любом случае, вы можете переназначить 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
на что-нибудь другое. 10
10 лет навсегда, точно так же, как вампир Клаудии навсегда исполнилось 5 лет (по крайней мере, пока ее не заменила Кирстен Данст).
* Предупреждение: не давайте Notorious BIG хот-дог. Зомби из гангста-рэпа нельзя кормить после полуночи.
a
,b
иc,
на все это указывает на то же значение (в данном случае список), или вы хотитеa=0
,b=3
иc=5
. В таком случае ты хочешьa,b,c = [0,3,5]
или простоa,b,c = 0,3,5
.