2013-05-22 3 views
1

Я начал изучать python несколько недель назад (без каких-либо знаний в программировании) и пошел на следующую проблему, связанную с распаковкой последовательностей, что меня смущает.Распаковка последовательностей в python

По какой-то причине, когда я пытаюсь это:

for b, c in [1,2]: 
    print b,c 

Я получаю сообщение об ошибке:

TypeError: 'int' object is not iterable

То же самое происходит, когда я пытаюсь заменить список с кортежем (1,2)

Но когда я пытаюсь то же самое, только с кортежем внутри списка:

for b, c in [(1,2)]: 
    print b,c 

это работает - я получаю:

1 2

Почему?

спасибо.

кстати Я использую Python 2.7

ответ

6

Каждый раз, когда вы делаете оператор in <iterable>, он извлекает один элемент из итерируемого, а затем распаковывает его в соответствии с вашими потребностями, в вашем случае b, c. Итак, в первом примере вы пытаетесь назначить b, c на 1, что невозможно, тогда как в следующем примере вы делаете b, c = (1, 2), который распаковывается успешно и дает вам b, c.

Например, попробуйте распечатать значения.

>>> for x in [1, 2]: 
     print "X: ", x 


X: 1 
X: 2 

>>> for x in [(1, 2)]: 
     print "X: ", x 


X: (1, 2) 

Таким образом, назначение b, c = 1 не представляется возможным, в то время как назначение b, c = (1, 2) возможно.

+0

'b = c = 1', вероятно, это то, что человек * намерен * с недопустимым примером' b, c = 1'. –

6

В Python for цикл занимает каждый элемент из итератора, и присваивает его имя (имена), перед выполнением блокового кода каждый раз.

В первом случае Python берет первый элемент, 1 и пытается назначить его b, c - это не работает, так как есть только одно значение для назначения, следовательно, ошибка.

Во втором примере, первое значение является весь кортеж (1, 2) - так это может быть распакованы, так как он содержит два требуемых значений.

Это ясно, что этот вопрос, когда вы кладете его в контекст:

a, b = 1, 2 
a, b = 1 

одно значение не может стать два.

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