Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Почему присвоенная переменная “зависит” другой переменной

#python #python_3x


Вот код:

a = {"1": "2", "3":"4"}
b = a
print(a, b)
b['1'] = "5"
print(a, b)


Почему в конце выводит {"1": "5", "3":"4"} это значение перемененной а

{"1": "5", "3":"4"} а это значение переменной b. Так вот почему когда изменилось
значение переменной b то и изменилось значение переменной a?
Может это я не прав, может так должно быть. Но если я не ошибаюсь, то b это копия a.   
    


Ответы

Ответ 1



b = a заставляет имя b ссылаться на тот же объект что и a имя, то есть a is b. Один объект — два имени. b = a никогда не копирует. Чтобы создать новый словарь, с теми же ключами, значениями: b = dict(a) В этом случае b['a'] = '5' изменяет новый словарь, не трогая исходный словарь. В общем случае, контейнеры могут определять .copy() метод. b это поверхностная копия, то есть сами ключи и значения не копируются, к примеру, a['3'] is b['3']. Чтобы создать копию и вложенных объектов рекурсивно: import copy c = copy.deepcopy(a)

Ответ 2



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

Ответ 3



a = {"1": "2", "3":"4"} b = a # переменная b ссылается на тот же словарь a is b # True Чтобы b ссылался на другой объект можно сделать copy: a = {"1": "2", "3":"4"} b= b.copy() a is b # False или так a = {"1": "2", "3":"4"} b = {"1": "2", "3":"4"} a is b # False

Ответ 4



Обе переменные являются ссылками на один объект, так как словарь - изменяемый объект. Так же будет и со списками.

Комментариев нет:

Отправить комментарий