Исходное значение списка 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?
Заранее благодарю вас!
Ответы
Ответ 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, что является последним значением, присвоенным я в понимании списка.