Python乘号创建的嵌套列表修改指定索引时所有子列表同步变更原因求解
问题原因说明
核心问题出在嵌套列表的初始化方式上,Python的*运算符对可变对象的复制逻辑是复制引用而非创建新对象:
- 执行
scores = [[0,0]]*10时,仅会生成1个[0, 0]子列表实例,*10操作只是把这个实例的内存引用重复了10次存入外层列表,scores中所有位置的子列表本质上是同一个对象。 - 执行
scores[1][1] += 1时,修改的是这个公共子列表实例的值,所有指向该实例的引用访问到的内容自然同步更新,就出现了修改一处全部生效的现象。
正确初始化方案
如果要生成互不影响的独立子列表,使用列表推导式初始化即可,每次迭代都会创建新的子列表实例:
scores = [[0, 0] for _ in range(10)] scores[1][1] += 1 print(scores) # 输出:[[0, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
内容的提问来源于stack exchange,提问作者linAlgebraThrowaway123
相关产品推荐
相关产品推荐

