2015-06-08 5 views
1

Почему y не также печатает пустой словарь?Программирование: базовое назначение python

x = {} 
y = x 
print y 
x['key'] = 'value' 
print y 
x = {} 
print x,y 

Результат:

{} 
{'key': 'value'} 
{} {'key': 'value'} 
+3

Поскольку имена в Python являются ссылками на объект, а не на сам объект. Указание имени на другой объект не изменяет никаких других ссылок на предыдущий объект. –

+0

@RakholiyaJenish: Вопрос: нет, но принятый ответ относится к той же причине. – Olaf

+0

@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) Вы поймете лучше –

ответ

-1

Причина в том, что когда вы делаете y = xx и y оба относятся к одному и тому же словарю.

Позже, когда вы говорите x={}, он создает новый пустой словарь и назначает его x. Это оставляет y, указывая на тот же старый словарь. Поэтому print x, y дал другое значение для x и y.

Если вы хотите очистить словарь, использовать x.clear(), это выплескивать словарь, и до сих пор x и y будет указывать на тот же старый словарь.

См: Difference between dict.clear() and assigning {} in Python

1

Задания не по значению, а по ссылке. Не значение копируется из x в y, а ссылка на объект, который в настоящее время поддерживается x. Итак, после y = x обе переменные фактически ссылаются на один и тот же объект.

Edit:

x = {} 

х ссылки новый объект ДИКТ, назовем его dá

y = x 

х, у и ссылки дА

x['key'] = 'value' 

запись добавлена ​​в дА

x = {} 

х ссылки новый объект ДИКТ дБ

print x,y 

у по-прежнему ссылается дА, х ссылки дБ

Вы только изменить ссылки на объекты. И все ссылки на объект независимы друг от друга, поэтому, если вы меняете один, вы не изменяете других.

+0

Я все еще не понимаю. если это по ссылке, а не копировать, тогда y должно быть пустым в конце. если я снова назначу x на y, тогда y пусто. пожалуйста, объясни. –

+0

@lilredindy: Читайте внимательно – Olaf

0

Вы переназначаете 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.

0

y это имя. Переменные - это имена, простые теги для идентификации места памяти.

Когда вы назначаете y = x, y указывает на одно и то же место x (например, в тот же словарь). Python не создает новую копию x: она просто заставляет y указывать на то же место x, что и указывает, и отслеживает, сколько ссылок на него имеет значение (словарь) (т. Е. Переменные, которые ссылаются на него).

Таким образом, после того, как вы добавили товар в словарь с x['key'] = 'value', y показывает вам то же значение, что и на самом деле.

Когда вы переназначаете новое значение x с помощью x = {}, y не изменяется: он по-прежнему указывает на словарь, на который он указывал раньше, поэтому теперь у вас есть два разных словаря.

Достаточно ясно?:)

0

Когда вы x = {} во второй раз, вы назначаете {} к x, но y все еще указывает на старый словарь

2

Сначала вы должны понять, что:

  • Всякий раз, когда вы говорите {} в своем коде, Python создает новый словарь. Это в основном более короткий синтаксис для dict().

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


Пройдем содержательных линий в коде:

x = {} 
y = x 
x['key'] = 'value' 
x = {} 

Lines:

  1. x = {}: Мы создаем новый Dict с помощью {}, а затем мы устанавливаем имя x, чтобы обратиться к этому новому словарю.
  2. y = x: Здесь мы установили имя y, чтобы указать на существующий dict, тот, который уже имеет имя x с пометкой на нем. У дикта теперь есть два имени. Обратите внимание, что y указывает на фактический dict, и его не волнует, изменилось ли имя x, чтобы указать на что-то еще. Подобно ценникам в магазинах, вы можете перемещать один, не касаясь другого
  3. x['key'] = 'value': Просто добавьте элемент в dict, который x указывает на. Это также может быть y['key'] = 'value', и выход будет таким же, поскольку x и y прилагаются к тому же dict.
  4. x = {}: Обратите внимание на то, что {} означает, что мы создаем новый словарь! Мы также установили имя x, чтобы указать на этот новый словарь - оставив оригинальный dict и имя y нетронутым, поэтому y по-прежнему относится к оригинальному dict с элементом в нем.

И это конец кода, теперь печать x выведет на экран пустой Dict (строка 4), но y все еще указывает на оригинальный Dict.

+0

Это было хорошо. Thanx много – vks

0

Первоначально и x и y ссылались на тот же словарь. Затем вы создали новый пустой словарь и указали x на него. Таким образом, y по-прежнему ссылается на исходный словарь, а x - нет.

Смежные вопросы