Почему y не также печатает пустой словарь?Программирование: базовое назначение python
x = {}
y = x
print y
x['key'] = 'value'
print y
x = {}
print x,y
Результат:
{}
{'key': 'value'}
{} {'key': 'value'}
Почему y не также печатает пустой словарь?Программирование: базовое назначение python
x = {}
y = x
print y
x['key'] = 'value'
print y
x = {}
print x,y
Результат:
{}
{'key': 'value'}
{} {'key': 'value'}
Причина в том, что когда вы делаете y = x
x
и y
оба относятся к одному и тому же словарю.
Позже, когда вы говорите x={}
, он создает новый пустой словарь и назначает его x. Это оставляет y
, указывая на тот же старый словарь. Поэтому print x, y
дал другое значение для x
и y
.
Если вы хотите очистить словарь, использовать x.clear()
, это выплескивать словарь, и до сих пор x
и y
будет указывать на тот же старый словарь.
См: Difference between dict.clear() and assigning {} in Python
Задания не по значению, а по ссылке. Не значение копируется из x в y, а ссылка на объект, который в настоящее время поддерживается x. Итак, после y = x
обе переменные фактически ссылаются на один и тот же объект.
Edit:
x = {}
х ссылки новый объект ДИКТ, назовем его dá
y = x
х, у и ссылки дА
x['key'] = 'value'
запись добавлена в дА
x = {}
х ссылки новый объект ДИКТ дБ
print x,y
у по-прежнему ссылается дА, х ссылки дБ
Вы только изменить ссылки на объекты. И все ссылки на объект независимы друг от друга, поэтому, если вы меняете один, вы не изменяете других.
Я все еще не понимаю. если это по ссылке, а не копировать, тогда y должно быть пустым в конце. если я снова назначу x на y, тогда y пусто. пожалуйста, объясни. –
@lilredindy: Читайте внимательно – Olaf
Вы переназначаете x
, но не переназначайте y
.
Первоначально они имеют одну и ту же ссылку, поэтому изменение объекта, с которым они ссылаются, отразится на обоих (как показано при назначении key/value
). Но если вы измените ссылку на одну из переменных, она не изменит ссылку на другую. Вместо этого измените объект, на который имеются ссылки:
>>> x = {}
>>> y = x
>>> x['item'] = 'value'
>>> x
{'item': 'value'}
>>> y
{'item': 'value'}
>>> del x['item']
>>> x
{}
>>> y
{}
Иными словами. y = x
не означает, что y равно x, это означает, что объект, на который ссылается y, совпадает с объектом ссылки x.
y это имя. Переменные - это имена, простые теги для идентификации места памяти.
Когда вы назначаете y = x
, y указывает на одно и то же место x (например, в тот же словарь). Python не создает новую копию x: она просто заставляет y указывать на то же место x, что и указывает, и отслеживает, сколько ссылок на него имеет значение (словарь) (т. Е. Переменные, которые ссылаются на него).
Таким образом, после того, как вы добавили товар в словарь с x['key'] = 'value'
, y показывает вам то же значение, что и на самом деле.
Когда вы переназначаете новое значение x с помощью x = {}
, y не изменяется: он по-прежнему указывает на словарь, на который он указывал раньше, поэтому теперь у вас есть два разных словаря.
Достаточно ясно?:)
Когда вы x = {}
во второй раз, вы назначаете {}
к x
, но y
все еще указывает на старый словарь
Сначала вы должны понять, что:
Всякий раз, когда вы говорите {}
в своем коде, Python создает новый словарь. Это в основном более короткий синтаксис для dict()
.
Переменные в Python на самом деле не являются переменными, это имена. Вы можете думать о них как ярлыки, которые вы привязываете к значениям, похожие на ценники в магазинах. Это означает, что вы можете перемещать их по своему усмотрению, и сами объекты не изменятся.
Пройдем содержательных линий в коде:
x = {}
y = x
x['key'] = 'value'
x = {}
Lines:
x = {}
: Мы создаем новый Dict с помощью {}
, а затем мы устанавливаем имя x
, чтобы обратиться к этому новому словарю.y = x
: Здесь мы установили имя y
, чтобы указать на существующий dict, тот, который уже имеет имя x
с пометкой на нем. У дикта теперь есть два имени. Обратите внимание, что y
указывает на фактический dict, и его не волнует, изменилось ли имя x
, чтобы указать на что-то еще. Подобно ценникам в магазинах, вы можете перемещать один, не касаясь другогоx['key'] = 'value'
: Просто добавьте элемент в dict, который x
указывает на. Это также может быть y['key'] = 'value'
, и выход будет таким же, поскольку x
и y
прилагаются к тому же dict.x = {}
: Обратите внимание на то, что {}
означает, что мы создаем новый словарь! Мы также установили имя x
, чтобы указать на этот новый словарь - оставив оригинальный dict и имя y
нетронутым, поэтому y
по-прежнему относится к оригинальному dict с элементом в нем.И это конец кода, теперь печать x
выведет на экран пустой Dict (строка 4), но y
все еще указывает на оригинальный Dict.
Это было хорошо. Thanx много – vks
Первоначально и x и y ссылались на тот же словарь. Затем вы создали новый пустой словарь и указали x на него. Таким образом, y по-прежнему ссылается на исходный словарь, а x - нет.
Поскольку имена в Python являются ссылками на объект, а не на сам объект. Указание имени на другой объект не изменяет никаких других ссылок на предыдущий объект. –
@RakholiyaJenish: Вопрос: нет, но принятый ответ относится к той же причине. – Olaf
@lilredindy Возможно, если вы [прочитайте это] (http://pythontutor.com/visualize.html#code=x+%3D+%7B%7D%0Ay+%3D+x%0Ax%5B'key'%5D+%3D+ ' значение '% 0Ax +% 3D +% 7B% 7D & mode = display & origin = opt-frontend.js & cumulative = false & heapPrimitives = false & textReferences = false & py = 3 & rawInputLstJSON =% 5B% 5D & curInstr = 4) Вы поймете лучше –