为什么Python中用[[]]*n生成的二维列表元素会互相影响?
核心原理
Python 中[x] * n的执行逻辑是:创建长度为n的新列表,其中每个元素都是同一个x对象的引用,并不会为每个元素重新生成新的x实例。
两种场景的差异
1. 元素为不可变对象(整数、字符串、元组等)
你第一个示例中的[0]*5,整数0属于不可变类型。后续执行l[0] = 1时,并不是修改原有0对象本身(不可变对象无法被修改),只是将列表第0位的引用替换为指向1的新内存地址,其他位置的引用仍然指向原有0,因此修改不会互相影响,输出符合预期。
2. 元素为可变对象(列表、字典等)
你第二个示例中的[[]]*5,空列表属于可变类型。此时生成的外层列表的5个元素,全部指向同一个空列表实例。执行l[0].append(1)、l[1].append(2)是直接修改这个公共列表实例的内容,所有指向该实例的位置都会同步显示修改结果,因此最终所有子列表内容完全一致。
生成独立子列表的简洁写法
使用列表推导式即可替代循环append,每次循环都会生成全新的独立空列表,不存在引用共享问题:
l = [[] for _ in range(5)] l[0].append(1) l[1].append(2) print(l) # 输出 [[1], [2], [], [], []]
内容的提问来源于stack exchange,提问作者dbld
相关产品推荐
相关产品推荐

