为什么y也不打印空字典?
x = {}
y = x
print y
x['key'] = 'value'
print y
x = {}
print x,y
结果:
{}
{'key': 'value'}
{} {'key': 'value'}
答案 0 :(得分:2)
首先你必须明白:
每当你在代码中说{}
时,Python就会创建一个新字典。它基本上是dict()
的较短语法。
Python中的变量不是真正的变量,它们是名称。您可以将它们视为附加到值的标签,类似于商店中的价格标签。这意味着您可以根据需要移动它们,并且对象本身不会改变。
让我们在您的代码中浏览有意义的行:
x = {}
y = x
x['key'] = 'value'
x = {}
行:
x = {}
:我们使用{}
创建一个新的dict,然后我们设置名称x
以引用该新词典。y = x
:在这里,我们将名称y
设置为指向现有的dict,即已在其上标记了x
的名称。该词典现在有两个名字。请注意,y
指向实际的字典,并且它并不关心名称x
是否更改为指向其他内容。与商店中的价格标签类似,您可以移动一个而不会触及另一个x['key'] = 'value'
:只需在x
指向的字典中添加一个项目即可。这也可以是y['key'] = 'value'
,输出结果完全相同,因为x
和y
附加到同一个字典。x = {}
:注意{}
,这意味着我们正在创建新词典!我们还将名称x
设置为指向此新词典 - 保留原始词典和名称y
不变,因此y
仍然引用其中包含项目的原始词典。 这就是代码的结尾,现在打印x
会输出一个空字典(第4行),但y
仍然指向原始字典。
答案 1 :(得分:1)
作业不是按价值,而是按参考。不是将值从x复制到y,而是对x当前持有的对象的引用。因此,在y = x
之后,两个变量实际上都引用了同一个对象。
修改强>
x = {}
x引用新的dict对象,称之为dA
y = x
x,y都参考dA
x['key'] = 'value'
条目已添加到dA
x = {}
x引用新的dict对象dB
print x,y
仍然引用dA,x引用dB
您只能更改对象的引用。并且对对象的所有引用都是相互独立的,因此如果您更改了一个对象,则不会更改其他对象。
答案 2 :(得分: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引用的对象相同。
答案 3 :(得分:0)
是一个名字。变量是名称,用于标识内存位置的简单标记。
当您指定y = x
时,y指向x所在的相同位置(即指向同一个字典)。 Python不会创建x的新副本:它只是让y指向x指向的相同位置,并跟踪值(字典)对它的引用数量(即引用它的变量)。
因此,在使用x['key'] = 'value'
向词典添加项目后,y会显示与x相同的值。
当您使用x = {}
将新值重新分配给x时,y不会更改:它仍指向之前指向的字典,因此现在您有两个不同的词典。
足够清楚? :)
答案 4 :(得分:0)
当您第二次x = {}
时,您将{}
分配给x
,但y
仍然指向旧词典
答案 5 :(得分:0)
最初x和y都引用了相同的字典。然后,您创建了一个新的空字典并将x指向它。因此,y仍然引用原始字典,而x则不是。
答案 6 :(得分:-1)
原因是当您执行y = x
x
和y
时,两者都会引用相同的字典对象。
稍后当你说x={}
时,它会创建一个新的空字典并将其分配给x。这使y
指向同一个旧字典。因此,print x, y
为x
和y
提供了不同的价值。
如果要清空字典,请使用x.clear()
,这将清空字典,仍然x
和y
将指向相同的旧字典。
参考:Difference between dict.clear() and assigning {} in Python