Python中深拷贝的问题怎么理解,如何应用
Admin 2022-06-23 群英技术资讯 322 次浏览
在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝。下面先了解一下几个概念:对象、可变类型、引用
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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python3在各种服务器环境中安装配置过程,源码包编译安装步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
django中时区常见问题有哪些?很多新手在学习django,对于时区的一些问题很容易混淆,对此,这篇文章就主要给大家分享django时区的内容,对新手学习django有一定的借鉴价值,感兴趣的朋友可以参考。
bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。
为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,下面这篇文章主要给大家介绍了关于Python自动化测试之异常处理机制的相关资料,需要的朋友可以参考下
这篇文章主要介绍了基于PyQt5完成的PDF拆分功能,本文介绍的pdf拆分功能还有一些待完善地方,例如可增加预览功能,实现每页预览,以及如何实现多条件拆分,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008