2013-12-11 5 views
4
def nrooks(n): 
    #make board 
    print n # prints 4 
    arr = [0 for n in range(n)] # if 0 for n becomes 0 for x, it works fine 
    print n # prints 3 instead of 4 

nrooks(4) 

Как наступил второй n становится 3, отличный от данного параметра?Python странное поведение в списке понимание

+0

альтернативно [этот] (http://stackoverflow.com/questions/19848082/why-do-list-comprehensions-write-to-the-loop-variable-but-generators-dont) – roippi

ответ

4

Python 2

n переменная, используемая в списке понимание такой же n, как передается в.

Осмысление устанавливает его 1, 2, а затем, наконец, 3.

Вместо этого измените его на

arr = [0 for _ in range(n)] 

или (удивительно!)

arr = list(0 for n in range(n)) 

Python 3

Это было исправлено.

From the BDFL himself:

Мы также сделали еще одно изменение в Python 3, чтобы улучшить эквивалентность между списковых и выражениями генератора. В Python 2, в список понимания «утечки» управляющая переменная цикла в окружающей сферы:

x = 'before' 
a = [x for x in 1, 2, 3] 
print x # this prints '3', not 'before' 

Это был артефакт первоначальной реализации списка постижений; это был один из «грязных маленьких секретов» Питона для лет. Он начался как преднамеренный компромисс, чтобы сделать список соображениями ослепляюще быстрыми, и, хотя это было не обычная ловушка для новичков, это определенно ужалило людей изредка. Для генераторов мы не могли этого сделать. Генератор выражения реализуются с помощью генераторов, исполнение которых требует отдельного кадра выполнения ...

Однако в Python 3, мы решили исправить «маленький грязный секрет» списковых, используя ту же самую стратегию реализации как для выражения . Таким образом, в Python 3 приведенный выше пример (после модификация для использования print (x) :-) будет печатать 'before'.

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