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

先来看一组代码:

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))

运行结果如下:

a:[1, [-1], 1]
b:[[1, [-1], 1]]
c:[1, [-1]]
d:[1, [100]]
  • 首先明确,当把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,是最安全的
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值