python一脚一个坑——list赋值的几种方法——深拷贝才是我想象的等于

python一脚一个坑——list赋值的几种方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013700358/article/details/84568607

先来看一组代码:

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的第一层,那么并不会影响拷贝的对象,但若修改更高层,则将会同步修改,如上面的ca中的1和[100] (整体) 都是第一层,而100属于第二层,因此修改第二层的数字时,c也相应改变
  • 深拷贝则是copy.deepcopy(x),如上面的d,这时两者相互独立,无论如何修改a, 都不会影响到d,是最安全的
posted @ 2019-09-16 17:24  haolemao  阅读(274)  评论(0编辑  收藏  举报