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就更方便了

猜你喜欢

转载自blog.csdn.net/qq_41926099/article/details/131324139