python一脚一个坑——list赋值的几种方法——深拷贝才是我想象的等于
python一脚一个坑——list赋值的几种方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
先来看一组代码:
import copy
def f1(aa):
aa.append(1)
aa[1][0] = -1
a = [1, [100]]
b = []
b.append(a)
c = copy.copy(a)
d = copy.deepcopy(a)
f1(a)
print('a:{}\n b:{}\n c:{}\n d:{}'.format(a, b, c, d))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
运行结果如下:
a:[1, [-1], 1]
b:[[1, [-1], 1]]
c:[1, [-1]]
d:[1, [100]]
- 1
- 2
- 3
- 4
- 首先明确,当把
list作为参数传递至函数内时,相当于C++中传递数组,改变函数内list的值,那么函数外的值也会相应改变,如上面的a - 其次,通过
'='或append()方法的赋值,相当于将两个变量进行了绑定,因此在函数内对a进行了修改,则函数外通过append()的方式初始化的变量b也相应改变
那么,该如何更安全地进行list间的拷贝呢?这里又涉及两种拷贝:浅拷贝与深拷贝
两种拷贝都需要import copy
- 浅拷贝用法为
copy.copy(x), 相当于,若后续操作只修改了被拷贝list的第一层,那么并不会影响拷贝的对象,但若修改更高层,则将会同步修改,如上面的c,a中的1和[100] (整体) 都是第一层,而100属于第二层,因此修改第二层的数字时,c也相应改变 - 深拷贝则是
copy.deepcopy(x),如上面的d,这时两者相互独立,无论如何修改a, 都不会影响到d,是最安全的

浙公网安备 33010602011771号