当前位置: 移动技术网 > IT编程>脚本编程>Python > python空字典列表两种生成方式对赋值带来的不同影响

python空字典列表两种生成方式对赋值带来的不同影响

2018年03月08日  | 移动技术网IT编程  | 我要评论

男模刘畅,麻将大三元,厦门 大丰收

最近在实现朴素贝叶斯算法碰到一个很有趣的现象(基于Python3.6.3)

我生成一个由10个空字典构成的列表:

第一种生成方式(可能大多数人都会用这种方法,形式简单)

>>a = [{}] * 10

但是在对a里的字典进行赋值时却出现了问题

>>a[3][3] = 32

>>a

[{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32},
{3: 32}]

>>a[4][4] = 5

>>a

[{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5},
{3: 32, 4: 5}]

可以发现对于a[A][B] = y,不管A是什么,这个表达式都会对a里所有的字典进行字段B的增加或者修改

但是用第二种方式(列表生成式)创建

>>a = [{} for i in range(10)]

>>a[3][3] = 32

>>a

[{}, {}, {}, {3: 32}, {}, {}, {}, {}, {}, {}]

>>a[4][4] = 5

>>a

[{}, {}, {}, {3: 32}, {4: 5}, {}, {}, {}, {}, {}]

可以发现对于a[A][B] = y,这个表达式可以单独对a里索引为A的字典进行字段B的增加或者修改

当时就是因为对第一种方式创建出来的空字典列表做这种赋值行为,掉到了坑里。换成第二种问题便解决了

不过至于为什么会有这种区别,我还不清楚。如果有大神知道的,烦请在下面留言。万分感激!!!

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网