两次迭代不会为dict产生错误吗?

时间:2019-08-15 21:41:20

标签: python

这是一个新手问题。

[(i,j) for i in range(3) for j in range(3)]

返回

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

但是,为什么

{i: j for i in range(3) for j in range(3)}

返回

{0: 2, 1: 2, 2: 2}

但是应该生成以下无效的字典

{0: 0, 0: 1, 0: 2, 1: 0, 1: 1, 1: 2, 2: 0, 2: 1, 2: 2}

2 个答案:

答案 0 :(得分:3)

Python 执行处理通过嵌套理解生成的完整的9元素表达式。 Python根据数据类型的规则处理表达式。这些元素中的每一个都是对指定的dict元素的分配,大致等同于

d = {}
d[0] = 0
d[0] = 1
d[0] = 2
d[1] = 0
d[1] = 1
d[1] = 2
d[2] = 0
d[2] = 1
d[2] = 2

这将导致您看到字典。您无法根据要求获取命令:

{0: 0, 0: 1, 0: 2, 1: 0, 1: 1, 1: 2, 2: 0, 2: 1, 2: 2}

因为这不是有效的,可持续的dict值。

Python不会引发错误,因为根据语言定义,表达式没有错误。在某些需要重写密钥的应用程序中。

答案 1 :(得分:1)

因为Python dict数据结构不允许重复的键。相反,在这种情况下,Python返回更新的最后一项。