[英]Are dict comprehensions evaluated incrementally in Python?
我假设purge
和purge2
的结果在以下代码中是相同的(删除重复的元素,保持第一次出现及其顺序):
def purge(a):
l = []
return (l := [x for x in a if x not in l])
def purge2(a):
d = {}
return list(d := {x: None for x in a if x not in d})
t = [2,5,3,7,2,6,2,5,2,1,7]
print(purge(t), purge2(t))
但它看起来与dict
式不同,与列表不同, d
的值是增量构建的。 这是实际发生的事情吗? 我是否从这个示例代码中正确推断出dict
理解的语义以及它们与list
理解的区别? 它是否仅适用于理解,或者也适用于指代被分配到的字典的其他右侧(例如嵌套在其他表达式中的理解,涉及迭代器的东西,除dict
以外的类型的理解)? 它在哪里指定并且可以查阅完整的语义? 或者它只是一个未记录的实现行为,不值得依赖?
这里没有任何“增量”发生。 在字典理解完成之前,海象运算符不会分配给变量。 if x not in d
指的是原始的空字典,而不是您使用推导式构建的字典,就像列表推导式的版本指的是原始的l
一样。
过滤掉重复项的原因仅仅是因为字典键总是唯一的。 试图创建一个重复的键只会忽略第二个。 就像你写的一样:
return {2: None, 2: None}
你只会得到{2: None}
。
所以你的 function 可以简化为
def purge2(a):
return list({x: None for x in a})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.