2013-09-28 3 views
4

Я работал с очередью на 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) 

почему как код работает по-другому?

+0

Потому что в 'x = y = Queue()' 'x' и' y' являются ссылками на один и тот же объект. –

+2

Также обратите внимание, что 'y.get (10)', вероятно, не то, что вы хотите. Первым параметром ['Queue.get()'] (http://docs.python.org/3.3/library/queue.html#queue.Queue.get) является 'block', который интерпретируется как' bool '. –

ответ

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 
3

Ваш первый код фактически эквивалентно:

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

, которая отличается от вашего второго примера, поскольку Python обрабатывает объект по ссылке. После x=y обе переменные x и y относятся к тому же объекту. Во втором примере у вас есть две независимые очереди.

Смежные вопросы