【问题标题】:why multiple assignments and single assignments behave differently in python为什么多个赋值和单个赋值在 python 中的行为不同
【发布时间】:2013-09-28 13:02:17
【问题描述】:

当我在代码中出现错误时,我正在使用 python 中的队列,即使代码对我来说看起来非常完美,但后来当我突然改变分配样式时,代码开始工作。之前的代码看起来有点像这样。

    x=y=Queue()
    x.put("a")
    x.put("b")
    print y.get()

后来我改成这个,它开始工作了

    x=Queue()
    y=Queue()
    x.put("a")
    x.put("b")
    print y.get(10)

为什么两个代码的工作方式不同?

【问题讨论】:

  • 因为在x=y=Queue() xy 是对同一个对象的引用。
  • 另外,请注意y.get(10) 可能不是您想要的。 Queue.get() 的第一个参数是block,它被解释为bool

标签: python


【解决方案1】:

Python 中的变量是引用或名称,不像 C 等中的变量。

这段代码:

x=y=Queue()

表示“允许名称y 引用通过调用Queue() 生成的内存中的对象,并允许名称x 引用y 指向的对象。”这意味着两个变量都指向同一个对象 - 您可以使用 id(x) == id(y) 进行验证。

这段代码:

x=Queue()
y=Queue()

表示“允许名称x引用Queue()创建的一个对象,并允许名称y引用Queue()创建的另一个对象”。在这种情况下,id(x) == id(y)False

这常常会咬到你:

a = [1,2,3,4,5]
b = a
b.append(6)
print(a)
# [1,2,3,4,5,6] even though we didn't seem to do anything to a!

要解决这个问题,请使用import copy; b = a.copy(); 而不是b = a

但是,这种行为不会发生在像整数这样的不可变对象上:

a = 7
a += 1

不会转到a 正在引用的对象并通过添加一个来更改它,而是从对象7 中取消引用a,并将其引用到表示该对象的对象a + 1 的先前值(即 8)。这与对可变对象执行的操作不同,例如前面示例中的列表 - 附加到列表确实会更改变量引用的对象。

所以我们可以这样做:

a = 7
b = a
a += 1
print(a)
# 8
print(b)
# 7

【讨论】:

    【解决方案2】:

    你的第一个代码实际上相当于:

    y=Queue()
    x=y
    x.put("a")
    x.put("b")
    print y.get()
    

    这与您的第二个示例不同,因为 Python 通过引用处理对象。在x=y 之后,xy 两个变量都指向同一个对象。在您的第二个示例中,您有两个独立的队列。

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2011-06-19
      • 2019-03-13
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多