Действительно ли возможно иметь список быть оцененным лениво в Python?
Например,
a = 1
list = [a]
print list
#[1]
a = 2
print list
#[1]
Если бы список был установлен оценить лениво тогда заключительную строку, то был бы [2]
Концепция "ленивого" вычисления обычно присутствует в функциональных языках, но в них нельзя переназначать два разных значения одному и тому же идентификатору, поэтому нельзя даже там можно было бы воспроизвести ваш пример.
Дело вовсе не в лени - дело в том, что использование идентификатора гарантированно идентично получению ссылки на то же значение, на которое ссылается идентификатор, и повторному присвоению идентификатора, простое имя с другим значением гарантирует, что идентификатор будет ссылаться на другое значение, отличное от них. Ссылка на первое значение (объект) не теряется.
Рассмотрим аналогичный пример, в котором повторное присвоение пустому имени не используется, а скорее используется любой другой вид мутации (для изменяемого объекта, конечно - числа и строки неизменяемы), включая присвоение чему-то else , кроме простого имени:
>>> a = [1]
>>> list = [a]
>>> print list
[[1]]
>>> a[:] = [2]
>>> print list
[[2]]
Поскольку не существует a - ...
, которое переназначает простое имя a
, а скорее a [ знак равно
, который переназначает
содержимое , тривиально легко сделать Python настолько «ленивым», насколько вы хотите (и действительно, потребуются некоторые усилия, чтобы сделать его «нетерпеливым»! -) ... если лень против рвения имеет какое-либо отношение к любому из этих случаев (а это не так ;-).
Просто имейте в виду совершенно простую семантику «присвоения простому имени» (в отличие от присвоения чему-либо еще, которое можно по-разному настраивать и контролировать, используя ваши собственные типы соответствующим образом), и оптическую иллюзию «ленивый против нетерпеливого» "может исчезнуть; -)
Python в целом не очень ленивый .
Вы можете использовать генераторы для имитации ленивых структур данных (например, бесконечных списков и т. Д.),но что касается таких вещей, как использование обычного синтаксиса списка и т. д., вам не будет лени.