直接看几个示例,对比这两种方法直接的不同
- 数字number类
a = [4] * 4
a[0] = 8
a # [8, 4, 4, 4]
a = [4 for _ in range(4)]
a[0] = 8
a # [8, 4, 4, 4]
- 列表
a = [[]] * 4
a[0].append(4)
print(a) # [[4], [4], [4], [4]]
a = [[] for _ in range(4)]
a[0].append(4)
print(a) # [[4], [], [], []]
- 字典
a = [{}] * 4
a[0]['a'] = 'a'
print(a) # [{'a': 'a'}, {'a': 'a'}, {'a': 'a'}, {'a': 'a'}]
a = [{} for _ in range(4)]
a[0]['a'] = 'a'
print(a) # [{'a': 'a'}, {}, {}, {}]
》》 非纯数字的列表初始化,不能用【[[]]*12】 这种结构
详细解释
[[]] * 4
是 Python 中的一种语法,用于创建一个包含多个引用同一列表的嵌套列表。
具体解释如下:
a = [[]] * 4
这行代码的含义是:
[]
:创建一个空列表。[[]]
:创建一个包含一个空列表的列表,即嵌套一层。[[]] * 4
:将这个列表复制 4 次,但是复制的是引用(指针),不是深拷贝。
最终结果是:
a = [[], [], [], []]
乍看之下这没问题,但四个元素其实都引用的是同一个空列表对象!
验证一下:
a[0].append(1)
print(a) # 输出:[[1], [1], [1], [1]]
你对任何一个元素做修改,其他元素都会变化,因为它们是同一个列表对象的引用。
正确做法(如果你想要4个独立的空列表):
a = [[] for _ in range(4)]
这样每个元素都是独立的新空列表。
如果你想进一步理解列表引用和复制的原理,我可以给你一些 代码示例 或 图示说明。