Python中深拷贝的问题怎么理解,如何应用
Admin 2022-06-23 群英技术资讯 1193 次浏览
在实际应用中,我们有时候会遇到“Python中深拷贝的问题怎么理解,如何应用”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Python中深拷贝的问题怎么理解,如何应用”文章能帮助大家解决问题。在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。下面先了解一下几个概念:对象、可变类型、引用
Python对象:在 Python 中,对象有一种很通俗的说法是,万物皆对象。说的就是构造的任何数据类型都是一个对象,无论是数字,字符串,还是函数,甚至是模块,Python都对当做对象处理。所有 Python 对象都拥有三个属性:身份、类型、值。看一个简单的例子:

可变与不可变对象:在Python中,按更新对象的方式,可以将对象分为 2 大类:可变对象与不可变对象。

引用:在 Python 程序中,每个对象都会在内存中申请开辟一块空间来保存该对象,该对象在内存中所在位置的地址被称为引用。在开发程序时,所定义的变量名实际就对象的地址引用。
引用实际就是内存中的一个数字地址编号,在使用对象时,只要知道这个对象的地址,就可以操作这个对象,但是因为这个数字地址不方便在开发时使用和记忆,所以使用变量名的形式来代替对象的数字地址。 在 Python 中,变量就是地址的一种表示形式,并不开辟开辟存储空间。
就像 IP 地址,在访问网站时,实际都是通过 IP 地址来确定主机,而 IP 地址不方便记忆,所以使用域名来代替 IP 地址,在使用域名访问网站时,域名被解析成 IP 地址来使用。
通过一个例子来说明变量和变量指向的引用:



浅拷贝只拷贝顶层引用,遇到引用类型,只是复制了个引用,修改了副本中引用类型里的数据,原数据也会改变,示例如下:


深拷贝会逐层进行拷贝,直到拷贝的所有引用都是不可变引用为止,示例如下:

lst1 = [1, [6, 7, 8], 3]
lst1
# [1, [6, 7, 8], 3]
lst2 = copy.deepcopy(lst1)
lst2
# [1, [6, 7, 8], 3]
lst2[1][1] = 996
print("副本:", lst2)
print("原始:", lst1)
# 副本: [1, [6, 996, 8], 3]
# 原始: [1, [6, 7, 8], 3]

在深拷贝中,修改了副本中引用类型里的数据,原数据不会改变。
总结如下:
def factorial(n):
return 1 if n == 1 else n * factorial(n - 1)
factorial(5)
结果如下:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
# 第10天早上想再吃时,见只剩下一个桃子了,说明第9天的时候就只剩一个桃子了
def eat_peach(n):
return 1 if n == 2 else 2 * (eat_peach(n - 1) + 1)
eat_peach(10)
结果如下:

# -*- coding: UTF-8 -*-
"""
@Author :叶庭云
@CSDN :https://yetingyun.blog.csdn.net/
"""
def fibonacii(n):
return n if n <= 1 else (fibonacii(n - 1) + fibonacii(n - 2))
x = int(input("输出前几项?: "))
if x <= 0:
print("请输入输入正数!")
else:
print("斐波那契数列前{}项:".format(x), end=" ")
for i in range(1, x + 1):
print(fibonacii(i), end=" ")
结果如下:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python包装异常处理方法,相比java,python的异常和java中不同,python主要是防止程序异常被中止。一旦被catch后它还行往下执行,本文就分享python相关的异常处理方法,需要的小伙伴可以参考一下
PyEcharts是一个用于生成 Echarts图表的类库, Python是一门富有表达力的语言,很适合用于数据处理,下面这篇文章主要给大家介绍了关于Python pyecharts数据可视化的相关资料,需要的朋友可以参考下
这篇文章主要为大家详细介绍了python基于双向链表实现LFU算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
python中如何实现多线程?线程是指进程内的一个执行单元,也是进程内的可调度实体,这篇文章主要给大家介绍的是python 实现多线程的三种方法,对新手学习和理解多线程有一定参考价值,下面我们一起来看看吧。
这篇文章主要给大家介绍了关于Python列表删除重复元素与图像相似度判断及删除的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008