奇怪的额外循环

2024-09-27 00:12:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还是有点陌生,但是,我现在觉得真的很蠢,因为我刚刚花了一个小时试图弄清楚为什么这个for循环没有达到我想要的效果。我不应该花一个小时在for循环上。不管怎样,我正在尝试生成一个字典列表,给每个字典一个唯一的数字,所以我做了这个。。。你知道吗

def initiate(n):
    records = {'num':0,'blah':0,'doubleblah':0}
    x = []
    for i in range(n):
        x.append(records)
        x[i]['num'] = i
    return x

x = initiate(4)
print(x)

我希望函数返回这个--

[
 {'num': 0, 'doubleblah': 0, 'blah': 0}, 
 {'num': 1, 'doubleblah': 0, 'blah': 0}, 
 {'num': 2, 'doubleblah': 0, 'blah': 0}, 
 {'num': 3, 'doubleblah': 0, 'blah': 0}
]

但它实际上返回这个--

[
 {'num': 3, 'doubleblah': 0, 'blah': 0}, 
 {'num': 3, 'doubleblah': 0, 'blah': 0}, 
 {'num': 3, 'doubleblah': 0, 'blah': 0}, 
 {'num': 3, 'doubleblah': 0, 'blah': 0}
]

…当我向函数中添加一些print语句时,我发现它似乎在向列表中的每个字典添加数字,而不仅仅是当前字典。我真的不知道代码如何添加到所有dict中,因为我显式地使用x[i] = i只将数字添加到当前字典中。你知道吗


Tags: 函数列表for字典def数字numblah
1条回答
网友
1楼 · 发布于 2024-09-27 00:12:04

所发生的事情是,您每次都在列表中添加对同一词典的引用。你知道吗

print list(map(id, initiate(4)))
# [42283920, 42283920, 42283920, 42283920]

您的函数正确地写为:

def initiate(n):
    return [ {'num': i, 'blah': 0, 'doubleblah': 0} for i in range(n) ]

每次都会产生一个新的字典实例。你知道吗

相关问题 更多 >

    热门问题