4

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

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

4

2 回答 2

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

所以我们可以这样做:

a = 7
b = a
a += 1
print(a)
# 8
print(b)
# 7
于 2013-09-28T13:06:51.683 回答
3

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

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

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

于 2013-09-28T13:08:58.583 回答