引用重定向、浅拷贝、深拷贝问题——python多维数组/list的创建与操作问题
python多维数组/list的创建与操作问题
1. 问题出现
当我创建多维数组的时候,更改某一的值的时候,会把整个列的值都改变了...类似于numpy数组的广播cast情况。但是在python中确是一个小坑。
2.几种常见的创建方式
1 #直接初始化 2 l1 = [[1,2,3],[4,5,6],[7,8,9]] 3 #浅拷贝方式 4 l2 = [[0]*3]*3 5 #深拷贝 6 l3 = [([0] *3) for i in xrange(3)] 7 l1[1][1] = 100 8 l2[1][1] = 100 9 l3[1][1] = 100 10 print l1, '\n', l2, '\n', l3, '\n'
结果:
1 [[1, 2, 3], [4, 100, 6], [7, 8, 9]] 2 [[0, 100, 0], [0, 100, 0], [0, 100, 0]] 3 [[0, 0, 0], [0, 100, 0], [0, 0, 0]]
3. 浅谈浅拷贝
可见第二种方式创建是将列表进行浅拷贝,从内存的角度来考虑的话:
[[1],[2],[3]]
假设[1]为第一行的列表,是一个对象,存储的堆中,在栈中有一个指向该[1]的内存地址@123abc(假设),浅拷贝则是在栈中新建一个栈内存空间存储指向[2]的地址作为[2]的地址指向
因此当我们无论修改[1] [2] 还是[3]的时候其实都是修改堆中的[1]。
4.引用重定向、浅拷贝、深拷贝
1 a = Node([1,2,3]) 2 b = a 3 print id(a) 4 print id(b) 5 import copy 6 b = copy.copy(a) 7 print id(a) 8 print id(b) 9 b.value[0] = 0 10 print a.value 11 print b.value 12 print '---------------' 13 a = Node([1, 2, 3]) 14 b = copy.deepcopy(a) 15 b.value[0] = 0 16 print a.value 17 print b.value
39943808 39943808 39943808 40308808 [0, 2, 3] [0, 2, 3] --------------- [1, 2, 3] [0, 2, 3]
可以看出引用重定向是同一个对象,浅拷贝确实是创建的对象,但是对象内部的所有东西全部指向原来的地址,但是深拷贝是把原来的a对象所有全部复制了一遍
参考链接:
https://www.cnblogs.com/btchenguang/archive/2012/01/30/2332479.html
有任何疑问请留言或者发送至邮箱397585361@qq.com