Python浅拷贝中值与引用的差异问题
问题解析:Python列表切片复制的深浅差异
先看执行的代码及对应结果:
第一步执行代码
x = [1,2,3,[4,5,6]] y = x[:] x[3][0] = 9
此时结果:
x = [1,2,3,[9,5,6]] y = [1,2,3,[9,5,6]]
第二步执行代码
x[0] = 99
此时结果:
x = [99,2,3,[9,5,6]] y = [1,2,3,[9,5,6]]
问题
为何修改嵌套列表中的元素时,x和y均会同步变化,而修改外层列表的元素时仅x发生变化?
原因说明
这核心是列表切片x[:]做的是浅拷贝,得搞清楚Python里列表的存储逻辑:
- 外层列表
x里的1、2、3都是不可变的整数类型,而[4,5,6]是可变的列表对象。 - 用
y = x[:]复制时,新列表y会生成一个新的外层容器,但只是把x里每个元素的引用复制过来,并没有复制元素本身。 - 对于外层的整数元素:因为整数不可变,修改
x[0] = 99其实是给x的第一个位置换了个新整数的引用,y的第一个位置还是原来1的引用,所以y不变。 - 对于嵌套的列表元素:
x[3]和y[3]指向的是同一个列表对象,不管通过x还是y修改这个嵌套列表的元素,都是操作同一个对象,所以两者会同步变化。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

