2013-04-18 7 views
0

Почему поведение распаковки изменяется, когда я пытаюсь сделать пункт назначения элементом массива?Python: распаковка элементов массива

>>> def foobar(): return (1,2) 
>>> a,b = foobar() 
>>> (a,b) 
(1, 2) 
>>> a = b = [0, 0] # Make a and b lists 
>>> a[0], b[0] = foobar() 
>>> (a, b) 
([2, 0], [2, 0]) 

В первом случае я получаю поведение, которое я ожидаю. Во втором случае оба назначения используют последнее значение в кортеже, который возвращается (т. Е. «2»). Зачем?

+0

Поведение распаковке изменения оленья кожа, вы делаете несколько назначение во 2-ом примере, не распаковывая – jamylak

ответ

3

Когда вы a = b = [0, 0], вы делаете как a и b указывают на же список. Поскольку они изменяемы, если вы измените их, вы измените их. Используйте вместо этого:

a, b = [0, 0], [0, 0] 
+0

Спасибо, Волатильность, за предложение. –

2

a = b = [0, 0] # Делает и б список же

+0

gnibbler, вы бьете меня тоже. :) Я только что осознал свою глупость и вернулся, чтобы удалить вопрос, и вы уже ответили. Спасибо за быстрый ответ. –

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