2013-01-11 65 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'一個字典。