#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
Обе переменные являются ссылками на один объект, так как словарь - изменяемый объект. Так же будет и со списками.
Комментариев нет:
Отправить комментарий