编程:基本的python任务

时间:2015-06-08 14:44:19

标签: python

为什么y也不打印空字典?

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

结果:

{}
{'key': 'value'}
{} {'key': 'value'}

7 个答案:

答案 0 :(得分:2)

首先你必须明白:

  • 每当你在代码中说{}时,Python就会创建一个新字典。它基本上是dict()的较短语法。

  • Python中的变量不是真正的变量,它们是名称。您可以将它们视为附加到值的标签,类似于商店中的价格标签。这意味着您可以根据需要移动它们,并且对象本身不会改变。

让我们在您的代码中浏览有意义的行:

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

行:

  1. x = {}:我们使用{}创建一个新的dict,然后我们设置名称x以引用该新词典。
  2. y = x:在这里,我们将名称y设置为指向现有的dict,即已在其上标记了x的名称。该词典现在有两个名字。请注意,y指向实际的字典,并且它并不关心名称x是否更改为指向其他内容。与商店中的价格标签类似,您可以移动一个而不会触及另一个
  3. x['key'] = 'value':只需在x指向的字典中添加一个项目即可。这也可以是y['key'] = 'value',输出结果完全相同,因为xy附加到同一个字典。
  4. x = {}:注意{},这意味着我们正在创建新词典!我们还将名称x设置为指向此新词典 - 保留原始词典和名称y不变,因此y仍然引用其中包含项目的原始词典。
  5. 这就是代码的结尾,现在打印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 xy时,两者都会引用相同的字典对象。

稍后当你说x={}时,它会创建一个新的空字典并将其分配给x。这使y指向同一个旧字典。因此,print x, yxy提供了不同的价值。

如果要清空字典,请使用x.clear(),这将清空字典,仍然xy将指向相同的旧字典。

参考:Difference between dict.clear() and assigning {} in Python