Python列表赋值异常:修改单个子列表为何影响多个元素?
为什么修改matrix[1][1]会同时改变matrix[0][1]?
嘿,这个问题其实是Python新手很容易踩的可变对象引用陷阱,我来给你讲明白到底咋回事~
问题根源:你在操作同一个列表的引用
看你的代码,当执行matrix.append(matrix[0])的时候,你并没有创建一个新的、和matrix[0]一样的列表,而是把matrix[0]这个列表本身的内存引用添加到了matrix里。
换句话说,此时matrix里的两个元素matrix[0]和matrix[1],指向的是同一个底层列表对象。就像你给同一个房间装了两扇门,不管从哪扇门进去修改房间里的东西,另一扇门进去看的时候,东西也变了。
所以当你执行matrix[1][1] = 1时,本质上是在修改那个共享的列表,自然matrix[0][1]也会跟着变成1。
怎么修复?创建独立的子列表
要解决这个问题,你需要给matrix添加独立的新列表,而不是共享引用。这里有两种简单的方式:
方式一:用列表推导式直接生成(最简洁)
这是创建二维列表的标准写法,直接生成完全独立的子列表:
size = 2 matrix = [[0 for _ in range(size)] for _ in range(size)] matrix[1][1] = 1 print(matrix) # 输出 [[0, 0], [0, 1]]
方式二:修改你的循环,手动拷贝列表
如果想保留你原来的循环结构,只需要在append的时候,对matrix[0]做一次浅拷贝,而不是直接添加引用:
size = 2 matrix = [[]] for j in range(size): matrix[0].append(0) for i in range(size-1): # 用.copy()或者list()来创建新的列表副本 matrix.append(matrix[0].copy()) matrix[1][1] = 1 print(matrix) # 输出 [[0, 0], [0, 1]]
小总结
Python里的可变对象(比如列表、字典)在赋值、添加到容器时,传递的都是引用,而不是值的拷贝。如果需要多个独立的对象,一定要手动做拷贝操作——浅拷贝(copy()/切片)就够处理这种简单的二维列表,如果是嵌套更深的结构,才需要用到深拷贝(copy.deepcopy())。
内容的提问来源于stack exchange,提问作者Andyy
相关产品推荐
相关产品推荐

