我什至无法正确搜索谷歌,但这里是:
a = {}
b = {}
c = [a, b]
for d in c:
d['ID'] = d
print c
返回:
[{'ID': {...}}, {'ID': {...}}]
为什么不是:
[{'ID': a}, {'ID': b}]
我什至无法正确搜索谷歌,但这里是:
a = {}
b = {}
c = [a, b]
for d in c:
d['ID'] = d
print c
返回:
[{'ID': {...}}, {'ID': {...}}]
为什么不是:
[{'ID': a}, {'ID': b}]
让我们一步一步来:
a = {}
b = {}
c = [a, b]
到目前为止,一切都很好。
for d in c:
d['ID'] = d
我们可以将其展开为:
d = c[0]
d['ID'] = d
d = c[1]
d['ID'] = 1
并将其扩展为:
d = a
d['ID'] = d
d = b
d['ID'] = d
现在替换:
a['ID'] = a
b['ID'] = a
所以,让我们暂时忘记循环,看看它做了什么:
>>> a = {}
>>> a['ID'] = a
>>> a
{'ID': {...}}
换句话说,您正在使每个dict
递归包含其自身的副本,在 key 下ID
。您希望如何打印?
所以,显而易见的事情是尝试打印整个字典:
{'ID': {'ID': {'ID': { …
但这将是一个无限长的字符串,Python 会在达到无穷大之前耗尽堆栈空间。所以它需要以某种方式截断它。
它不能打印这个:
{'ID': a}
因为a
is 只是一个恰好绑定到 的名称dict
,就像d
当时的 is 一样。事实上,循环甚至不知道那个a
时候绑定到那个;它知道那d
是。但即使它知道,结果也是错误的。想一想:
>>> e = a
>>> a = 0
>>> e
???
因此,显而易见的答案是使用省略号(有点像我在人类可读版本中所做的)来表示“等等”。
for d in c:
d['ID'] = d
应该
c = [{'ID': d} for d in c]
您的代码将 ID 元素添加到c
. 这意味着a = {'ID': a}
在您的代码运行之后。它包含对自身的引用。
我的代码片段生成一个新的dict,其属性'ID'
包含来自c
.
a 是字典。
b 是字典。
c 是两个字典的列表(不是“两个名称”或“两个变量”)。
另一个苏格拉底式的解释:如果它会返回[{'ID': a}, {'ID': b}]
,值显示为a
并且b
将是哪种类型?
考虑循环在做什么: a = {} b = {} c = [a, b]
for d in c:
d['ID'] = d
d 将是 a 或 b,这样
a['ID'] = a
b['ID'] = b
但回想一下 a 和 b 是 {},即 dics 本身。结果,您将 ['ID'] 分配给 dic 本身,从而创建了一个循环。当你
print(c)
你得到 [{'ID': {...}}, {'ID': {...}}]
是因为键的值是 dic 本身而不是它的变量表示,因此你得到 {...} 来反映循环的性质。注意 this 之后 a['ID']['ID']
,甚至 a ['ID']['ID']['ID']['ID']
is {'ID': {...}}
,因为键的值是 dic 本身,而不是指向它的变量。