Я попытался использовать множественное присваивание, как показано ниже, для инициализации переменных, но меня смутило поведение, я ожидаю переназначить список значений отдельно, я имею в виду, что b [0] и c [0] равны 0, как и раньше.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
Результат: [1, 3, 5] [1, 3, 5] [1, 3, 5]
Это правильно? что мне использовать для многократного назначения? чем отличается от этого?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
результат: ('f:', 3) ('e:', 4)
a
,b
иc,
на все это указывает на то же значение (в данном случае список), или вы хотитеa=0
,b=3
иc=5
. В таком случае ты хочешьa,b,c = [0,3,5]
или простоa,b,c = 0,3,5
.Ответы:
Если вы переходите на Python с языка в каталоге C / Java / etc. семье, это может помочь вам перестать думать о ней
a
как о «переменной» и начать думать о ней как о «имени».a
,,b
иc
не разные переменные с равными значениями; это разные имена для одного и того же значения. У переменных есть типы, идентификаторы, адреса и тому подобное.В именах ничего этого нет. Значения делать, конечно же , и вы можете иметь много имен для того же значения.
Если вы дадите
Notorious B.I.G.
хот-дог *Biggie Smalls
иChris Wallace
съедите хот-дог. Если вы измените первый элементa
на 1, первые элементыb
иc
равны 1.Если вы хотите узнать, называют ли два имени один и тот же объект, используйте
is
оператор:Затем вы спрашиваете:
Здесь вы повторно связываете имя
e
со значением4
. Это никак не влияет на именаd
иf
никоим образом.В своей предыдущей версии вы назначали
a[0]
, а неa
. Итак, с точки зренияa[0]
, вы перепривязываетеa[0]
, но с точки зренияa
, вы меняете его на месте.Вы можете использовать
id
функцию, которая дает вам некоторый уникальный номер, представляющий личность объекта, чтобы точно узнать, какой объект является каким, даже если онis
не может помочь:Обратите внимание, что значение
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 = [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 хот-дог. Зомби из гангста-рэпа нельзя кормить после полуночи.
источник
have, a = b = c = 10;
попытаемся обновить значение b, это повлияет на любое другое? хотя я проверил, что их идентификаторы совпадают.?10
неизменяемый - это означает, что нет возможности обновить значение, поэтому ваш вопрос не имеет смысла. Вы можете указатьb
другое значение, но это не повлияет наa
иc
, которые по-прежнему указывают на исходное значение. Разница, которую делают списки, заключается в том, что они изменяемы - например, вы можетеappend
использовать список, илиlst[0] = 3
, и это обновит значение, которое будет видно во всех именах этого значения.Кашель кашель
источник
a,b,c = 1,2,3
без скобок работает в Python 2 или 3, если вам действительно нужен дополнительный сантиметр читабельности.Да, это ожидаемое поведение. a, b и c установлены как метки для одного и того же списка. Если вам нужно три разных списка, вам нужно назначить их индивидуально. Вы можете либо повторить явный список, либо использовать один из многочисленных способов скопировать список:
Операторы присваивания в Python не копируют объекты - они связывают имя с объектом, и объект может иметь столько меток, сколько вы установили. При первом редактировании, изменяя a [0], вы обновляете один элемент единого списка, на который ссылаются все a, b и c. Во втором случае, изменяя e, вы переключаете e на метку для другого объекта (4 вместо 3).
источник
В python все является объектом, включая «простые» типы переменных (int, float и т. Д.).
Когда вы изменяете значение переменной, вы фактически меняете его указатель , и если вы сравниваете две переменные, он сравнивает их указатели . (Для ясности, указатель - это адрес в физической памяти компьютера, где хранится переменная).
В результате, когда вы изменяете значение внутренней переменной, вы меняете его значение в памяти, и это влияет на все переменные, которые указывают на этот адрес.
Для вашего примера, когда вы это делаете:
Это означает, что a и b указывают на один и тот же адрес в памяти, который содержит значение 5, но когда вы это делаете:
Это не влияет на b, потому что теперь a указывает на другую ячейку памяти, содержащую 6, а b по-прежнему указывает на адрес памяти, содержащий 5.
Но когда вы это сделаете:
a и b, опять же, указывают на одно и то же место, но разница в том, что если вы измените одно из значений списка:
Он изменяет значение памяти, на которую указывает a, но по-прежнему указывает на тот же адрес, что и b, и, как результат, b также изменяется.
источник
PyObject
. Это не так в других реализациях, таких как PyPy или Jython. (На самом деле, даже не ясно, как это могло быть правдой, потому что языки, на которых написаны эти реализации, даже не имеют указателей.)Вы можете использовать,
id(name)
чтобы проверить, представляют ли два имени один и тот же объект:Списки изменяемы; это означает, что вы можете изменить значение на месте, не создавая новый объект. Однако это зависит от того, как вы измените значение:
Если назначить новый список
a
, то его идентификатор будет меняться, так что это не повлияетb
иc
«s значения:Целые числа неизменяемы, поэтому вы не можете изменить значение без создания нового объекта:
источник
id
не обязательно место в памяти. Как говорится в документации , это возвращает «идентификатор… целое число… которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни». CPython использует адрес памяти как адресid
, но другие реализации Python могут не использовать. PyPy, например, этого не делает. А высказывание «две переменные указывают на одну и ту же ячейку памяти» вводит в заблуждение любого, кто понимает это в стиле Си. «Два имени для одного и того же объекта» является более точным и менее вводящим в заблуждение.в вашем первом примере
a = b = c = [1, 2, 3]
вы действительно говорите:Если вы хотите установить 'a' равным 1, 'b' равным '2' и 'c' равным 3, попробуйте следующее:
Надеюсь это поможет!
источник
Проще говоря, в первом случае вы назначаете несколько имен для
list
. В памяти создается только одна копия списка, и все имена относятся к этому месту. Таким образом, изменение списка с использованием любого из имен фактически изменит список в памяти.Во втором случае в памяти создается несколько копий одного и того же значения. Таким образом, каждая копия не зависит друг от друга.
источник
Что вам нужно, так это:
источник
Код, который делает то, что мне нужно, может быть таким:
Результат:
источник