python数组字典牵一发而动全身问题

        今天写了段代码,功能为保存每个人获得每种评级的次数,程序经过大幅度简化后基本如下:

keys_dict = ['a', 'b', 'c']
padding_vector = [0, 0, 0]
pairs = [['a', 1], ['b', 2], ['c', 3]]
dict = {}
for key in keys_dict:
    dict[key] = padding_vector
for pair in pairs:
    dict[pair[0]][pair[1] - 1] += 1
print(dict)

        这里的keys_dict就是花名册,pairs中的每一个二元组中,左边的为具体的人,右边的为他得到的评级。本来dict预期的结果是

{'a': [1, 0, 0], 'b': [0, 1, 0], 'c': [0, 0, 1]}

        结果实际输出为

{'a': [1, 1, 1], 'b': [1, 1, 1], 'c': [1, 1, 1]}

        而且在print(dict)后面加上print(padding_vector),padding_vector的结果也是[1, 1, 1]

        但把代码中的dict[key] = padding_vector修改为dict[key] = [0, 0, 0]就可以输出预期结果了。个人推测,python中的字典中的某个key如果直接等于某个对象,那么实际操作不是复制一份对象放在字典里,而是建立一个索引,指向这个对象。因此在最初的代码中,所有键值均指向padding_vector,修改键对应的值也是在修改padding_vector。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值