Python二维列表使用*创建后赋值出现非预期结果如何解决
错误核心原因
你遇到的问题本质是Python中可变对象的引用复制机制:
- 你编写的
array = [[0,0]] * 50并没有生成50个独立的[0,0]子数组,只是把同一个[0,0]列表对象的引用复制了50次,整个二维列表所有位置的子数组都指向内存中同一个列表对象。 - 因此你修改任意位置的子数组元素(比如
array[i][0] = 1),本质上都是修改同一个内存对象,自然所有子数组的取值都会同步变化。 - 你可以通过
print(id(array[0]), id(array[1]))验证:用*生成的数组两个子数组的内存地址完全相同。
修正方案
生成包含50个独立子数组的二维列表即可,推荐两种常用写法:
- 列表推导式写法(更简洁)
array = [[0, 0] for _ in range(50)] for i in range(15, 30): array[i][0] = 1
- 循环追加写法
array = [] for _ in range(50): array.append([0, 0]) for i in range(15, 30): array[i][0] = 1
两种写法都会为每个子数组单独开辟内存空间,修改单个子数组不会影响其他元素。
内容的提问来源于stack exchange,提问作者CoderTang
相关产品推荐
相关产品推荐

