2013-01-11 63 views
0

创建新的词典我甚至能正常搜索谷歌它,但这里有云:试图通过迭代

a = {} 
b = {} 
c = [a, b] 
for d in c: 
    d['ID'] = d 
print c 

回报:

[{'ID': {...}}, {'ID': {...}}] 

为什么不是:

[{'ID': a}, {'ID': b}] 
+4

'a'是一个变量名,程序不能打印。 –

+0

在循环中,您将'd'中的'ID'键重新分配给'd'本身 - 您的代码完全没有意义。你想达到什么目的? – praseodym

+1

您是否有意创建递归包含自己的词典,然后问他们为什么以这种方式展示,或者这不是您想要做的? – abarnert

回答

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 
??? 

所以,显而易见的答案是使用省略号(有点像我在人类可读的版本中那样)来表示“等等”。

+0

非常感谢你,这是一个很好的解释,它不会让我自己嵌套(虽然它应该有)。 – brett

0

一个是一本字典。

b是字典。

c是两个字典(不是“两个名字”或“两个变量”)的列表。

另一个苏格拉底解释: 如果将返回[{'ID': a}, {'ID': b}],数值显示为ab是哪种类型的?

0

考虑什么环路是做: 一个= {} 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本身,而不是指向它的变量。

0
for d in c: 
    d['ID'] = d 

应该是

c = [{'ID': d} for d in c] 

您的代码在c添加ID元件到每个类型的字典。代码运行后,这意味着a = {'ID': a}。它包含对自身的引用。

我的片段生成与含有从c的值的属性'ID'一个字典。