Skip to main content
 首页 » 编程设计

python之"Lazy"Python中的列表项评估

2025年05月04日11cloudgamer

由于缺乏更好的词,我选择了这个标题。

我想要的是能够做这样的事情:

>>> from random import randint 
>>> fruits = [ 
...     "Orange", 
...     "Banana", 
...     f"{randint(2,5)} Cherries", 
... ] 
 
>>> fruits[2] 
'3 Cherries' 
 
>>> fruits[2] 
'5 Cherries' 
 
>>> fruits[2] 
'2 Cherries' 

但是,字符串中的文字表达式在创建列表时会被计算一次,并且每次访问它时都会给出相同的结果。

我想知道除了编写一些复杂的边缘情况处理之外是否有更简单/更智能的方法来解决这个问题(毕竟我们是程序员;谁不喜欢编写漂亮的代码并且优雅又花哨?)。 我说边缘案例处理是因为我的 49 个字符串中只有 6 个需要这种“特殊”行为。

到目前为止,我尝试过从 randint 调用中创建一个 lambda 函数,但这并没有帮助;同样的结果。 也许这是惰性评估的情况,但我需要一些关于如何(或是否?)将其与列表一起使用的指导。

请您参考如下方法:

如果您希望您的一些项目是文字的,但有些是可调用的,您可以创建您自己的list版本:

from random import randint 
 
class LazyList(list): 
    'Like a list, but invokes callables' 
    def __getitem__(self, key): 
        item = super().__getitem__(key) 
        if callable(item): 
            item = item() 
        return item 
 
fruits = LazyList([ 
    "Orange", 
    "Banana", 
    lambda: f"{randint(2,5)} Cherries", 
]) 
 
print(fruits[2]) 
print(fruits[2])