python 二维数组的拷贝问题

因为python没有指针的概念,就跟c++不一样,c++当修改一个数组时可以直接看出来的对原始指针的修改还是对另一个副本的修改,这就导致python在对一个列表进行修改时可能把不想被修改的原始列表也给修改了,比如:

a = [1, 2, 3]
b = a
b[0] = 9
print(a) # 输出[9, 2, 3]

可以看到虽然改的是b但是a也被改变了,这其实是因为b并不是一个独立的列表,他只是a的一个“引用”,如果想创建一个完全独立的和a长的一样的列表就需要把a复制一份,就像这样:

a = [1, 2, 3]
b = a[:]
b[0] = 9
print(a) # [1, 2, 3]
print(b) # [9, 2, 3]

这里的复制就是对a进行全切片,也可以使用copy.deepcopy()来实现(需要 import copy),可这样不够帅。但是当碰到二维数组时,一个[:]就不够了,比如:

a = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
b = a[:]
b[0][0] = 8
print(a)  # [[8, 1, 1], [2, 2, 2], [3, 3, 3]]

这是因为虽然对a整个进行了拷贝,但是a里面的三个小列表仍然不是拷贝,b虽然是独立的,但是b里面的内容仍然是a里面三个小列表的引用,所以要对每一个小列表进行单独的拷贝操作,就像这样:

a = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
b = [a[i][:] for i in range(len(a))]
b[0][0] = 8
print(a) # [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

当然也可以使用copy.deepcopy()来实现 b = copy.deepcopy(a),但是那样不够帅。不过当a的维度高起来似乎用deepcopy就更方便了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值