創建新的詞典我甚至能正常搜索谷歌它,但這裏有雲:試圖通過迭代
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