2012-07-03 2 views
0

Я действительно думал, что я понял Python переменную реферирование, поэтому я запутался, почему этот код не делает переменную «а» быть «1»:Python Переменные Referecing - неожиданное поведение с молнией

>>> a,b,c = None, None, None 
>>> for var, val in zip((a,b,c),[1]): 
...  var = val 
... 
>>> print a 
None 
>>> print var 
1 

Может кто-нибудь объясняет, что здесь делает Python? Почему «вар» и «а» не указывают на одно и то же место?

Вопрос с бонусом: Какой изящный способ назначить три переменные из списка, которые могут содержать 1-3 элемента, и оставить переменные равными None, если список не подходит?

+0

Обратите внимание, что ваш почтовый является отбрасывая b и c, поскольку первый список длиннее второго. это намеренно? – argentage

+0

Вы помещаете переменные в кортеж (a, b, c), которые являются неизменяемыми. Использование списка [a, b, c] может помочь, но я сомневаюсь, что он будет как 'zip', вероятно, просто считывает значения – Russ

ответ

6

Может ли кто-нибудь объяснить, что здесь делает Python?

Он присваивает значение переменной val переменной var. Он не меняется a. Попробуйте следующее, чтобы увидеть, что происходит:

>>> a, b, c = None, None, None 
>>> print(zip((a,b,c), [1,2,3])) 
[(None, 1), (None, 2), (None, 3)] 

zip никогда не видит переменные a, b и c, только значения они привязаны к.

Ознакомьтесь с использованием Python переменных (имен, действительно) в Code Like a Pythonista.

Что является элегантным способом присвоить три переменные из списка, который может содержать 1-3 элемента, и оставить переменные равными None, если список не подходит?

Не динамически строить переменные. Вместо этого используйте список.

vars = (lst + [None] * 3)[:3] 

Затем используйте vars[0] и т.д. Или

x, y, z = (lst + [None] * 3)[:3] 
+1

. Последняя форма называется« распаковкой кортежа »и может использоваться для смешного бизнеса, такого как' a, b, c = 10,20,30' или даже 'a, b = b, a'. – Kos

+0

@ Kos: и делает некоторую полезную проверку ошибок, чтобы увидеть, имеет ли правая сторона желаемую длину. –

+0

Спасибо x, y, z = (lst + [None] * 3) [: 3] довольно умно. – Greg

0

Причина, по которой-х значение Нет, потому что вы никогда не назначен 1 к a. Таким образом, вам потребуется убедиться, что ему присваивается значение.

2

переменные а, б, в получить оценку их значений при передаче zip:

>>> a,b,c = None, None, None 
>>> zip((a,b,c),[1]) 
[(None, 1)] 

Затем в цикле у вас есть не то, что вы ожидали:

for var, val in [(None, 1)]: 
    #-- here var is bound to the value None 

    var = val 
    #-- here var is bound to the value 1 

    #print val