Как оператор присваивания создает глубокую копию? - PullRequest
0 голосов
/ 21 сентября 2018

Ниже приведен код

a =2 
b = a
b = 3
print (b,a)
3 2

Я ожидаю, что значение a также изменится на 3, если b указывает только на область памяти a и неу меня своя память.

Я уверен, что есть очень простое объяснение, которое мне не хватает.

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

если вы переназначаете значение b, python переназначает b, который имеет другое значение и ячейку памяти.затем.печатая адрес с id (a) и id (b), вы можете видеть, что если значения различны, то адреса памяти фактически различны.

попробуйте в оболочке python:

a = 3
b = a
id(b) == id(a) #it returns True

b = 2
id(b) == id(a) #it returns False
0 голосов
/ 21 сентября 2018

Нет.Присвоение копирует ссылку на объект, а не на сам объект.например,

a = [1, 2, 3]
b = a
b[0] = 5
print(a) # gives [5, 2, 3]

Однако

b = a
b = 3

переназначает b новому целочисленному литералу, не имея ничего общего с a.

Также,не является частью вашего вопроса, но вы увидите разницу между изменяемым и неизменным объектами.

0 голосов
/ 21 сентября 2018

Проблема здесь в том, что вы думаете о переменных Python как о указателях, где это совсем не плохо, но они так не работают.Вы должны думать о переменных Python как о метках значений.Также вы должны подумать об изменчивых и неизменных данных.Строки и целые числа Python являются неизменяемыми, это означает, что python создает новый номер для каждой операции и переназначает переменную на новый номер.

Как в вашем примере:

--------------------------------
|     3    |    2   |   ..     |
--------------------------------

a = 2 # a points to place 1 in our example memmory block
b = a # b points to the same memmory block as a
b = 3 # b change to point to the memmory block where 3 is located, place 0

В случае, если это:

a = 2 # a points to place 1 in our example memmory block
b = a # b points to the same memmory block as a
b += 1 # b == 2, b + 1 == 3, so b will point to a 3, a is still not modified
0 голосов
/ 21 сентября 2018

b = a указывает b на тот же объект, что и a.Но затем, когда вы делаете b = 3, переназначает b, чтобы указать на другой объект.a не затрагивается.

...