创建新的词典我甚至能正常搜索谷歌它,但这里有云:试图通过迭代
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
递归包含自身的副本,下键ID
。你会如何期待它被打印?
所以,很明显的事情是尝试打印整个字典:
{'ID': {'ID': {'ID': { …
但是这将是一个无限长的字符串,和Python将达到无穷大之前运行的堆栈空间。所以它需要以某种方式截断它。
它不能打印:
{'ID': a}
因为a
只是碰巧被绑定到dict
,就像d
是在当时的名称。事实上,循环做甚至不知道该a
绑定到当时的;它知道d
是。但即使没有知道,结果将是错误的。想想这个:
>>> e = a
>>> a = 0
>>> e
???
所以,显而易见的答案是使用省略号(有点像我在人类可读的版本中那样)来表示“等等”。
非常感谢你,这是一个很好的解释,它不会让我自己嵌套(虽然它应该有)。 – brett
一个是一本字典。
b是字典。
c是两个字典(不是“两个名字”或“两个变量”)的列表。
另一个苏格拉底解释: 如果将返回[{'ID': a}, {'ID': b}]
,数值显示为a
和b
是哪种类型的?
考虑什么环路是做: 一个= {} B = {} C = [A,B]
for d in c:
d['ID'] = d
d将是A或B,使得
a['ID'] = a
b['ID'] = b
但记得a和b都是{},它们都是自己的。因此,您将['ID']分配给dic本身,创建一个循环。当你
print(c)
你[{'ID': {...}}, {'ID': {...}}]
因为键的值是DIC本身,而不是它的变量表示,所以你得到{...},以反映循环的性质。 注意这个a['ID']['ID']
之后,甚至['ID']['ID']['ID']['ID']
是{'ID': {...}}
,因为密钥的值是dic本身,而不是指向它的变量。
for d in c:
d['ID'] = d
应该是
c = [{'ID': d} for d in c]
您的代码在c
添加ID元件到每个类型的字典。代码运行后,这意味着a = {'ID': a}
。它包含对自身的引用。
我的片段生成与含有从c
的值的属性'ID'
一个新字典。
'a'是一个变量名,程序不能打印。 –
在循环中,您将'd'中的'ID'键重新分配给'd'本身 - 您的代码完全没有意义。你想达到什么目的? – praseodym
您是否有意创建递归包含自己的词典,然后问他们为什么以这种方式展示,或者这不是您想要做的? – abarnert