引用重定向、浅拷贝、深拷贝问题——python多维数组/list的创建与操作问题

本文探讨了Python中多维数组的创建及拷贝机制,对比了直接初始化、浅拷贝与深拷贝的不同效果,解析了内存引用与对象拷贝的区别,为避免数组操作陷阱提供了实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/sunll9201/p/9996086.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值