字典理解是否在 Python 中递增评估?
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}
.
所以你的函数可以简化为
def purge2(a):
return list({x: None for x in a})
我假设 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}
.
所以你的函数可以简化为
def purge2(a):
return list({x: None for x in a})