Python 使用乘法创建可变对象数组避坑

听风人 南风知我意,吹梦到西洲 本文由博客端 http://106.14.174.140 主动推送

我们在使用 python 时经常会使用类似 my_list = [1]*10 初始化一个全 1 数组。
这是没有什么问题的,但是在数组元素为可变对象时会存在问题。
具体现象可以看下面的实验结果

In [1]: l=[{}]*10

In [2]: for d in l:
   ...:     print(id(d),d)
   ...:
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
1921294056384 {}
In [3]: for i in range(10):
   ...:     l[i].update(a=i)
   ...:

In [4]: print(l)
[{'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9}, {'a': 9},
 {'a': 9}, {'a': 9}]

可以发现,数组元素其实为同一个对象引用,当对其中的元素进行更新的时候其实是在更新同一个对象。
但是改成不可变对象比如数字类型,字符串类型,就不会有这个问题。

对于以上数组元素为字典类型的问题,可以采用列表生成式,每次创一个新的字典对象:

l = [dict() for i in range(10)]
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    436 引用 • 612 回帖 • 541 关注

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...