gpt4 book ai didi

python - 使用 randint 意外执行更新字典

转载 作者:行者123 更新时间:2023-11-28 20:45:24 27 4
gpt4 key购买 nike

我正在尝试运行一个简单的程序,其中我试图在循环中运行 random.randint() 以更新字典值,但它似乎无法正常工作。它似乎总是产生相同的值(value)。

到目前为止的程序如下。我正在尝试创建一个均匀分布的人口,但我不确定为什么这不起作用。

import random

__author__ = 'navin'

namelist={
"person1":{"age":23,"region":1},
"person2":{"age":24,"region":2},
"person3":{"age":25,"region":0}
}

def testfunction():
default_val={"age":23,"region":1}
for i in xrange(100):
namelist[i]=default_val
for index in namelist:
x = random.randint(0, 2)
namelist[index]['region']=x

print namelist


if __name__ == "__main__" :
testfunction()

我希望这 103 个人大致均匀分布在区域 0-2 中,但我让每个人都在区域 0 中。

知道为什么会这样吗?我是否错误地使用了 randint

最佳答案

这是因为在 for 循环中创建的所有 100 个字典条目不仅引用相同的值,而且引用相同的对象。因此,只有 4 个不同的字典作为值 - 最初创建的 3 个和您使用键 0-99 添加 100 次的第四个。

这可以用 id() 函数来演示,该函数为每个不同的对象返回不同的整数:

from collections import Counter

...

ids = [ id(i) for i in namelist.values() ]
print Counter(ids)

结果:

Counter({139830514626640: 100, 139830514505160: 1, 
139830514504880: 1, 139830514505440: 1})

要获得不同的字典,您需要复制默认值:

namelist[i] = default_val.copy()

或者在每个循环中创建一个新字典

namelist[i] = {"age": 23, "region": 1}

关于python - 使用 randint 意外执行更新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com