热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python深拷贝和浅拷贝

在python中,当你对一个对象赋值,将其作为参数传递,或者作为结果返回时,python通常会使用指向原对象的引用(即把新对象的内存地址指向原对象),而不是真正的拷贝。其它的一些语

      在python中,当你对一个对象赋值,将其作为参数传递,或者作为结果返回时,python通常会使用指向原对象的引用(即把新对象的内存地址指向原对象),而不是真正的拷贝。其它的一些语言则在每次赋值时都都进行拷贝操作。在python中不为赋值操作进行“隐式”的拷贝,要得到一个拷贝,必须明确的要求进行拷贝。

      所以,在python中,默认情况下对象赋值为浅拷贝即对象引用,而深拷贝则为真正的对象拷贝。



一,我们先来了解一下id函数,官方解释如下:

id(object)
Return the “identity” of an object. This is an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
CPython implementation detail: This is the address of the object in memory.

简而言之,id函数就是返回对象在自己生命周期中的内存地址。下面看两个例子:

In [48]: print id(‘abc‘)
3074738896
In [49]: cmd=‘abc‘
In [50]: print id(cmd)
3074738896

In [51]: x=‘bbc‘
In [52]: y=‘bbc‘
In [54]: print id(x),id(y),id(‘bbc‘)
3052874184 3052874184 3052874184

在Python中一切皆对象,像字符串abc,数字这样的值都是对象,只不过数字是一个整型对象,而‘abc‘是一个字符串对象。上面的赋值操作cmd=‘abc‘,在Python中实际的处理过程是这样的:

先在内存中搜索是否存在字符串abc,如果字符串abc已经在内存中存在了,那就直接返回已存在的字符串abc的内存地址,让变量cmd指向这个已存在字符串abc的内存地址。如果内存中不存在字符串abc,就先申请一段内存分配给一个字符串对象来存储字符串abc,然后让变量cmd去指向这个对象,实际上就是指向这段内存(这里有点和C语言中的指针类似)。这样做的好处,就是提升了速度。

而id(‘abc’)和id(cmd)的结果一样,说明id函数在作用于任何对象(字符串对象或是变量对象)时,其返回的都是对象指向的内存地址。



二,浅拷贝案例:

默认情况下,我们向新对象中插入数据,则老对象也会更新(当然向原对象插入数据,新对象也会更新):

In [37]: a=[1,2,3]
In [38]: b=a
In [39]: b.append(333)
In [40]: print a
[1, 2, 3, 333]
In [41]: print b
[1, 2, 3, 333]

In [42]: print id(a),id(b)
3054610764 3054610764

结论:

我们通过id函数看到,两个对象a,b指向同一片内存地址空间。即他们a和b对象之间的赋值操作属于引用,不是拷贝。故修改任意一个对象,另一个对象也会随之改变。



三,深拷贝案例

我们可以通过如下方法来解决对象引用的问题:

In [62]: import copy

In [63]: a=[1,2,3]
In [64]: b=copy.deepcopy(a)
In [65]: b.append(333)
In [66]: print a
[1, 2, 3]
In [67]: print b
[1, 2, 3, 333]
In [68]: print id(a),id(b)
3064057292 3064057644

我们需要使用copy.deepcopy方法来显示的进行对象拷贝,这样就不会出现前拷贝的问题。



四,判断两个对象是否是同一个

1,可以通过id函数来判断

2,使用如下方式

In [72]: a=[1,2,3]
In [73]: b=a
In [74]: a is b
Out[74]: True


In [75]: a=[1,2,3]
In [76]: b=copy.deepcopy(a)
In [77]: a is b
Out[77]: False


本文出自 “佳” 博客,请务必保留此出处http://leejia.blog.51cto.com/4356849/1589466

python 深拷贝和浅拷贝


推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 本文介绍了 AngularJS 中的 $compile 服务及其用法,通过示例代码展示了如何使用 $compile 动态编译和链接 HTML 元素。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 使用Jsoup解析并遍历HTML文档时,该库能够高效地生成一个清晰、规范的解析树,即使源HTML文档存在格式问题。Jsoup具备强大的容错能力,能够处理多种异常情况,如未闭合的标签等,确保解析结果的准确性和完整性。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 在 LeetCode 的“有效回文串 II”问题中,给定一个非空字符串 `s`,允许删除最多一个字符。本篇深入解析了如何判断删除一个字符后,字符串是否能成为回文串,并提出了高效的优化算法。通过详细的分析和代码实现,本文提供了多种解决方案,帮助读者更好地理解和应用这一算法。 ... [详细]
author-avatar
鱼儿玩玩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有