为什么多个赋值和单个赋值在python中表现不同

时间:2013-09-28 13:02:17

标签: python

当我在代码中出现错误时,我正在使用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)

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

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:3)

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

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

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