【问题标题】:Programming: basic python assignment [duplicate]编程:基本的python分配[重复]
【发布时间】:2015-06-08 14:44:18
【问题描述】:

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

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

结果:

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

【问题讨论】:

  • 因为 Python 中的名称是对对象的引用,而不是对象本身。将名称指向另一个对象不会更改对前一个对象的任何其他引用。
  • @RakholiyaJenish:问题:不是,但接受的答案是指相同的原因。
  • @lilredindy 也许如果你read this你会更好理解
  • @Olaf:感谢您的指正。我认为它是重复的,因为两者都导致相同的答案,并且可以通过它解决疑问。
  • @RakholiyaJenish:嗯,答案更多地集中在改变对象上,这个问题更多的是关于 N:1 关系。两者都有联系,但我想说的是不同的方面。

标签: python


【解决方案1】:

首先你必须明白:

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

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


让我们看一下代码中有意义的行:

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

行:

  1. x = {}:我们使用{} 创建一个新字典,然后我们设置名称x 来引用那个新字典。
  2. y = x:这里我们将名称 y 设置为指向现有的字典,即已经标记了名称 x 的字典。 dict 现在有两个名字。请注意,y 指向实际的字典,它并不关心名称 x 是否更改为指向其他内容。与商店中的价格标签类似,您可以在不触碰另一个的情况下移动其中一个
  3. x['key'] = 'value':只需在 x 指向的字典中添加一个项目。这也可能是y['key'] = 'value',并且输出完全相同,因为xy 附加到同一个字典。
  4. x = {}:注意{},这意味着我们正在创建一个新字典!我们还将名称 x 设置为指向这个新字典 - 保留原始字典和名称 y 不变,因此 y 仍然指的是其中包含项目的原始字典。

您的代码到此结束,现在打印 x 将输出一个空字典(第 4 行),但 y 仍然指向原始字典。

【讨论】:

  • 这很好。非常感谢
【解决方案2】:

赋值不是按值,而是按引用。不是从 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

y 仍然参考 dA,x 参考 dB

您只需更改对象的引用。而且对一个对象的所有引用都是相互独立的,所以如果你改变了一个,你不会改变其他的。

【讨论】:

  • 我还是不明白。如果它是通过引用而不是复制,那么 y 最后应该是空的。如果我再次将 x 分配给 y,则 y 为空。请解释一下。
  • @lilredindy:仔细阅读
【解决方案3】:

您重新分配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的引用对象是一样的。

【讨论】:

    【解决方案4】:

    当您第二次执行x = {} 时,您将{} 分配给x,但y 仍然指向旧字典

    【讨论】:

      【解决方案5】:

      最初 x 和 y 都引用同一个字典。然后,您创建了一个新的空字典并将 x 指向它。因此, y 仍然引用原始字典,而 x 不是。

      【讨论】:

        【解决方案6】:

        y 是一个名字。变量是名称,是标识内存位置的简单标记。

        当您分配 y = x 时,y 指向 x 所指的同一个地方(即同一个字典)。 Python 不会创建 x 的新副本:它只是让 y 指向 x 指向的同一个地方,并跟踪值(字典)对其有多少引用(即引用它的变量)。

        因此,在您使用 x['key'] = 'value' 将项目添加到字典后,y 会显示与 x 相同的值。

        当您使用 x = {} 为 x 重新分配一个新值时,y 不会改变:它仍然指向它之前指向的字典,所以现在您有两个不同的字典。

        够清楚吗? :)

        【讨论】:

          【解决方案7】:

          原因是当你在做y = xxy时都引用同一个字典对象。

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

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

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

          【讨论】:

            猜你喜欢
            • 2021-12-08
            • 1970-01-01
            • 1970-01-01
            • 2019-11-10
            • 2015-05-24
            • 2019-05-16
            • 2022-11-03
            • 2022-01-23
            • 1970-01-01
            相关资源
            最近更新 更多