Python,惰性列表

标签 python lazy-evaluation

是否可以在 Python 中延迟计算列表?

例如

a = 1
list = [a]
print list
#[1]
a = 2
print list
#[1]

如果列表设置为惰性求值,那么最后一行将是 [2]

最佳答案

“惰性”求值的概念通常伴随函数式语言出现——但在这些语言中,您无法将两个不同的值重新分配给同一个标识符,因此,即使在那里,您的示例也无法重现。

重点根本不是懒惰——而是保证使用标识符与获取对标识符所引用的相同值的引用是相同的,并且重新分配一个标识符,一个裸名,到一个不同的值,保证使标识符引用一个与它们不同的值。对第一个值(对象)的引用不会丢失。

考虑一个类似的例子,其中没有重新分配给裸名,而是任何其他类型的突变(当然,对于可变对象——数字和字符串是不可变的),包括对某物的分配 < strong>else 不是裸名:

>>> a = [1]
>>> list = [a]
>>> print list
[[1]]
>>> a[:] = [2]
>>> print list
[[2]]

因为没有 a - ... 重新分配裸名 a,而是 a[:] = ... 重新分配 acontents,很容易让 Python 像你希望的那样“懒惰”(事实上,让它变得“急切”需要一些努力! -)...如果懒惰与渴望与这两种情况中的任何一种有任何关系(事实并非如此;-)。

只需注意“分配给一个裸名”的非常简单的语义(与分配给其他任何东西,可以通过适本地使用您自己的类型进行各种调整和控制),以及“懒惰与渴望”的视觉错觉"可能会消失;-)

关于Python,惰性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2399194/

相关文章:

python - Django - 保存上传的图像

python - 让 bash 脚本将多个程序作为单独的进程执行

Haskell 斐波那契解释

scala - 缓存和持久化何时执行(因为它们看起来不像操作)?

python - 将一个数组作为索引传递给另一个数组?

python - Keras - 用于文本分析的自动编码器

python - 在csv文件python中打印输出

Python:惰性字符串解码

clojure - 在 clojure 中创建一个列表 "unlazy"

clojure - Clojure 中最简单的惰性函数