0

我什至无法正确搜索谷歌,但这里是:

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

返回:

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

为什么不是:

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

4 回答 4

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递归包含其自身的副本,在 key 下ID。您希望如何打印?

所以,显而易见的事情是尝试打印整个字典:

{'ID': {'ID': {'ID': { …

但这将是一个无限长的字符串,Python 会在达到无穷大之前耗尽堆栈空间。所以它需要以某种方式截断它。

它不能打印这个:

{'ID': a}

因为ais 只是一个恰好绑定到 的名称dict,就像d当时的 is 一样。事实上,循环甚至不知道那个a时候绑定到那个;它知道那d是。但即使它知道,结果也是错误的。想一想:

>>> e = a
>>> a = 0
>>> e
???

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

于 2013-01-11T01:08:22.433 回答
0
for d in c:
    d['ID'] = d

应该

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

您的代码将 ID 元素添加到c. 这意味着a = {'ID': a}在您的代码运行之后。它包含对自身的引用。

我的代码片段生成一个的dict,其属性'ID'包含来自c.

于 2013-01-11T01:54:00.443 回答
0

a 是字典。

b 是字典。

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

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

于 2013-01-11T01:05:44.987 回答
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 本身。结果,您将 ['ID'] 分配给 dic 本身,从而创建了一个循环。当你

print(c)

你得到 [{'ID': {...}}, {'ID': {...}}]是因为键的值是 dic 本身而不是它的变量表示,因此你得到 {...} 来反映循环的性质。注意 this 之后 a['ID']['ID'],甚至 a ['ID']['ID']['ID']['ID'] is {'ID': {...}},因为键的值是 dic 本身,而不是指向它的变量。

于 2013-01-11T01:20:59.460 回答