我甚至无法正确搜索谷歌,但这里有:
a = {}
b = {}
c = [a, b]
for d in c:
d['ID'] = d
print c
返回:
[{'ID': {...}}, {'ID': {...}}]
为什么不呢:
[{'ID': a}, {'ID': b}]
答案 0 :(得分:2)
让我们一步一步:
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
递归地包含密钥ID
下的自身副本。你怎么期望这个被打印出来?
所以,显而易见的是尝试打印整个字典:
{'ID': {'ID': {'ID': { …
但是这将是一个无限长的字符串,Python在到达无穷大之前会耗尽堆栈空间。所以它需要以某种方式截断它。
无法打印出来:
{'ID': a}
因为a
只是恰好绑定到dict
的名称,就像当时d
一样。实际上,循环甚至知道当时a
被绑定了;它知道d
是。但即使确实知道,结果也是错误的。想一想:
>>> e = a
>>> a = 0
>>> e
???
所以,显而易见的答案是使用省略号(有点像我在人类可读的版本中所做的那样)来表示“等等”。
答案 1 :(得分:0)
a是字典。
b是一本字典。
c是两个词典的列表(不是“两个名字”或“两个变量”)。
另一种社会解释:
如果它会返回[{'ID': a}, {'ID': b}]
,则显示为a
和b
的值将属于哪种类型?
答案 2 :(得分:0)
考虑循环正在做什么: a = {} b = {} c = [a,b]
for d in c:
d['ID'] = d
d将是a或b,这样
a['ID'] = a
b['ID'] = b
但是回想起a和b是{},dics本身。结果,你为dic本身分配了['ID'],创建了一个循环。当你
print(c)
你得到[{'ID': {...}}, {'ID': {...}}]
,因为键的值是dic本身而不是它的变量表示,因此你得{...}来反映循环的本质。
请注意,在a['ID']['ID']
之后,甚至['ID']['ID']['ID']['ID']
是{'ID': {...}}
之后,因为键的值本身就是dic,而不是指向它的变量。
答案 3 :(得分:0)
for d in c:
d['ID'] = d
应该是
c = [{'ID': d} for d in c]
您的代码正在为c
中的每个词组添加ID元素。这意味着代码运行后a = {'ID': a}
。它包含对自身的引用。
我的代码段会生成一个新字典,其中的属性'ID'
包含c
的值。