引用重定向、浅拷贝、深拷贝问题——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

posted @ 2018-11-21 16:49  亮亮·Leo  阅读(236)  评论(0编辑  收藏  举报