前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python--拷贝

python--拷贝

原创
作者头像
languageX
发布2023-02-01 09:29:26
3210
发布2023-02-01 09:29:26
举报
文章被收录于专栏:计算机视觉CV

对于传参数还是传引用还是这个问题,在上学C语言的时候就被烦过一段时间。那在python中,参数传递是传参还是传引用呢?拷贝为什么还分浅拷贝和深拷贝呢?区别是什么呢?本文主要来介绍python中的拷贝。

数据类型

在了解拷贝之前,我们先了解下python中的数据类型。

python中的内置数据类型,分为可变和不可变两种。

可变:列表,字典,集合

不可变:整数,浮点数,字符串,元组

比较好理解,列表是可以进行增删改的,而整数1就是1,1不能改为2。

代码语言:javascript
复制
nums = [1,2,3,4,5]
id(nums)
nums.append(6)
id(nums)

nums的值变量,但是内存地址没变

代码语言:javascript
复制
a=1
id(a)
a=2
id(a)

a的值变了,执行不同的整数,内存地址也就变了

代码语言:javascript
复制
def add_str(_str):
    _str += "def"
    return _str
    
def add_list(_list, val):
    _list.append(val)
    return _list

str = "abc"
add_str(str)
==> abc

nums = [1,2,3]
add_list(nums, 4)
==>[1,2,3,4]

以上例子不可变类型做为参数传入,变量没有被改变;可变类型传入后,变量被改变了。

原始是因为在python中参数传递传入的是变量所指对象的引用,由于字符串是不可变变量,函数内对字符串进行了修改就需要新开一个内存地址,保存新的字符串,所以不会对传入变量进行修改。

而列表是可变类型,变量进行了修改,但是内存地址还是同一个地址,所以传入的变量也发生了变化。

浅拷贝

代码语言:javascript
复制
import copy
a = [1,2,3,4]
b = a.copy()
b.append(5)
id(a)
id(b)
==>a=[1,2,3,4]
==>b=[1,2,3,4,5]

浅拷贝是创建一个新的容器,对于对象中的元素,还是使用原始元素的引用。

上面的例子,b是一个新的容器,所以可变列表修改后,不会影响a。

代码语言:javascript
复制
import copy
a = [1,[2],3,4]
b = a.copy()
b[1]=0
id(a)
id(b)
==>a=[1,[0],3,4]
==>b=[1,[0],3,4]

以上情况,由于a[1]和b[1]是同一个引用,我们修改b[1],还是会影响a[1]的,这种情况就需要使用深拷贝。

深拷贝

深拷贝和浅拷贝一样会创建一个新的容器,并且对于对象中的元素也会重新生成一个新的对象。

代码语言:javascript
复制
a=[1,[2,3],4,5]
b = copy.deepcopy(a)
b[1].append(0)
==>
a=[1,[2,3],4,5]
b=[1,[2,3,0],4,5]

赋值

赋值和深拷贝浅拷贝不一样,它是并没有创建任何新的容器的。我们可以看看传递参数是肤质还是拷贝。

代码语言:javascript
复制
import copy
def fun(b):
    print("arg id = ", id(b))
    b[0]=2

a=[1,2,3,4]
a_copy=a.copy()
print("a id = ",id(a))
print("a_copy id = ",id(a_copy))
fun(a)
print(a)
==>
a id =  4387526848
a_copy id =  4387526688
arg id =  4387526848
[2, 2, 3, 4]

通过以上打印可以看出,传参数是一个赋值过程,并没有创建新的容器,只有拷贝才会创建新的容器,所以这种情况下一定要注意,可变变量在函数体中的修改是会影响变量的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据类型
  • 浅拷贝
  • 深拷贝
  • 赋值
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档