为什么在python中多个赋值和单个赋值的行为不同

为什么在python中多个赋值和单个赋值的行为不同,python,Python,当我在python中使用queue时,代码中出现了一个错误,尽管代码看起来非常完美,但后来我突然改变了赋值样式,代码开始工作。代码以前看起来像这样 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) 为什么这两种代码的工作方式不同?P

当我在python中使用queue时,代码中出现了一个错误,尽管代码看起来非常完美,但后来我突然改变了赋值样式,代码开始工作。代码以前看起来像这样

    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)

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

Python中的变量是引用或名称,与C等中的变量不同

此代码:

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

此代码:

x=y=Queue()
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!
要解决这个问题,请执行导入副本;b=a.复制()而不是
b=a

但是,不可变对象(如整数)不会出现这种行为:

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

因此,我们可以这样做:

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

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

y=Queue()
x=y
x.put("a")
x.put("b")
print y.get()
这与第二个示例不同,因为Python通过引用处理对象。在
x=y
之后,两个变量
x
y
都指向同一对象。在第二个示例中,您有两个独立的队列。

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