试图通过迭代创建新的词典

时间:2013-01-11 01:01:10

标签: python

我甚至无法正确搜索谷歌,但这里有:

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

返回:

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

为什么不呢:

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

4 个答案:

答案 0 :(得分: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
???

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

答案 1 :(得分:0)

a是字典。

b是一本字典。

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

另一种社会解释: 如果它会返回[{'ID': a}, {'ID': b}],则显示为ab的值将属于哪种类型?

答案 2 :(得分: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本身。结果,你为dic本身分配了['ID'],创建了一个循环。当你

print(c)

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

答案 3 :(得分:0)

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

应该是

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

您的代码正在为c中的每个词组添加ID元素。这意味着代码运行后a = {'ID': a}。它包含对自身的引用。

我的代码段会生成一个字典,其中的属性'ID'包含c的值。