Подтвердить что ты не робот

Исходное значение списка Python

рассмотрим следующий фрагмент кода, который показывает понимание списка.

>>> i = 6
>>> s = [i * i for i in range(100)]
>>> print(i)

Когда вы выполняете пример кода в Python 2.6, он печатает 99, но когда вы его выполняете в Python 3.x, он печатает 6,

В чем причина изменения поведения и почему это результат 6 в Python 3.x?

Заранее благодарю вас!

4b9b3361

Ответ 1

Старое поведение было ошибкой, но не могло быть легко исправлено, поскольку на него ссылался какой-то код.

Переменная i внутри понимания списка должна быть другой i от той, что находится на верхнем уровне. Логически он должен иметь свою собственную область действия, которая не распространяется за пределы понимания, поскольку ее значение имеет смысл только в понимании. Но в Python 2.x из-за детализации реализации область была больше, чем необходимо, заставляя переменную "просачиваться" во внешнюю область видимости, вызывая замешательные результаты.

Python 3.0 был намеренно не предназначен для обратной совместимости с предыдущими версиями, поэтому они использовали возможность исправить это нежелательное поведение.

В версиях Python 2.3 и более поздних версиях понимание списка "утечки" управляющих переменных каждого из них содержит в области содержимого. Однако это поведение устарело, и полагаться на него не будет работать в Python 3.0

Источник

Ответ 2

Да, есть причина, и причина в том, что они не хотели, чтобы временная переменная в понимании списка протекала во внешнее пространство имен. Таким образом, это намеренное изменение, которое является результатом понимания списков, которые теперь являются синтаксическим сахаром для передачи выражения генератора в список().

Ссылка: PEP3100.

Ответ 3

Марк Байерс прекрасно ответил на это.

как примечание стороны.
в Python 2.x, если вы измените свои скобки на parens (создавая выражение генератора вместо понимания списка), вы заметите, что контрольная переменная не просочилась.

>>> i = 6
>>> s = (i for i in range(100))
>>> print i
6

против.

>>> i = 6
>>> s = [i for i in range(100)]
>>> print i
99

(конечно же, в Python 3 это фиксировано, а в списках отсутствуют больше контрольных переменных)

Ответ 4

Похоже на изменение взгляда на меня.

Я подтвердил ваш результат в Python 2.6; он действительно печатает 99, что является последним значением, присвоенным я в понимании списка.