Python中对象的引用与复制代码示例

 更新时间:2017年12月04日 09:23:33   作者:再见紫罗兰  
这篇文章主要介绍了Python中对象的引用与复制代码示例,具有一定借鉴价值,需要的朋友可以了解下。

可以说Python没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。

Python没有「变量」,我们平时所说的变量其实只是「标签」,是引用。

python中,"a=b"表示的是对象a引用对象b,对象a本身没有单独分配内存空间(重要:不是复制!),它指向计算机中存储对象b的内存。因此,要想将一个对象复制为另一个对象,不能简单地用等号操作,要使用其它的方法。如序列类的对象是(列表、元组)要使用切片操作符(即':')来做复制。

在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象:

>>> a = 'xyz'
>>> import sys
>>> sys.getrefcount(a)
3
>>> b = a
>>> sys.getrefcount(b)
4
>>> id(a)
88292288L
>>> id(b)
88292288L

这样,当引用的对象是可变对象的时候(列表,字典,可变集合等),会产生意料之外的行为:

>>> a = [1, 2, 3, 4]
>>> b = a
>>> b.append(5)
>>> a
[1, 2, 3, 4, 5]

因为a和b引用的是同一对象,改变其中一个,另外一个也会随之改变。当我们想建立一个副本而不是引用时,可以复制对象。

复制对象一般使用copy模块:

>>> a = [1, 2, 3, 4]
>>> import copy
>>> b = copy.copy(a)
>>> b.append(5)
>>> b
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4]

这样就可以了,但这种复制是一种浅复制,复制的新对象中包含的是对原始对象中的项的引用,如果对象的项为可变对象,也会产生不可控行为:

>>> a = [1, [1, 2]]
>>> b = copy.copy(a)
>>> b[1].append(3)
>>> b
[1, [1, 2, 3]]
>>> a
[1, [1, 2, 3]]

这时候就要使用深复制了。深复制将创建一个新对象,并递归地复制它所包含的所有对象:

>>> a = [1, [1, 2]]
>>> b = copy.deepcopy(a)
>>> b[1].append(3)
>>> b
[1, [1, 2, 3]]
>>> a
[1, [1, 2]]

对于不可改变的对象而言(字符串,数字,元组)等,没有必要拷贝,因为它们是不可改变的,不用担心会不经意间改动了它们。拷贝操作也只会得到原对象:

>>> a = (1, 2, 3)
>>> b = copy.copy(a)
>>> a is b
True

对于可变对象来(列表,字典,可变集合)来说,可以分别使用内置函数list(),dict(),set()来进行浅复制,速度是比使用copy模块快的。

列表也可以使用切片进行浅复制:

>>> a = [1, 2, 3, 4]
>>> b = a[:]
>>> a is b
False
>>> b
[1, 2, 3, 4]

对序列数据类型(字符串,列表,元组)进行*操作时,也仅仅是复制了对象中项的引用,如果使用*创建一个多维列表:

>>> a = [1, 2, 3]
>>> b = [a]
>>> c = b * 3
>>> a.append(4)
>>> c
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

最好是在列表推导中使用浅复制来创建多维列表,可以避免隐式的引用共享:

>>> a = [1, 2, 3]
>>> c = [list(a) for i in range(3)]
>>> a.append(4)
>>> c
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

总结

以上就是本文关于Python中对象的引用与复制代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。

您可能感兴趣的文章:

相关文章

  • Python中猜拳游戏与猜筛子游戏的实现方法

    Python中猜拳游戏与猜筛子游戏的实现方法

    这篇文章主要给大家介绍了关于Python中猜拳游戏与猜筛子游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解在OpenCV中实现的图像标注技术

    详解在OpenCV中实现的图像标注技术

    图像标注在计算机视觉中很重要,计算机视觉是一种技术,它允许计算机从数字图像或视频中获得高水平的理解力,并以人类的方式观察和解释视觉信息,本文将重点讨论在OpenCV的帮助下创建这些注释,感兴趣的朋友一起看看吧
    2022-06-06
  • Python+Tkinter实现简单的画图软件

    Python+Tkinter实现简单的画图软件

    这篇文章主要为大家详细介绍了如何利用Python和Tkinter实现编写一个简单的画图软件,可以实现画图、保存、撤销等功能,感兴趣的可以了解一下
    2023-04-04
  • python实现搜索本地文件信息写入文件的方法

    python实现搜索本地文件信息写入文件的方法

    这篇文章主要介绍了python实现搜索本地文件信息写入文件的方法,涉及Python针对文件的遍历及属性操作相关技巧,需要的朋友可以参考下
    2016-02-02
  • python3爬取各类天气信息

    python3爬取各类天气信息

    这篇文章主要为大家详细介绍了python3爬取各类天气信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • python使用magic模块进行文件类型识别方法

    python使用magic模块进行文件类型识别方法

    今天小编就为大家分享一篇python使用magic模块进行文件类型识别方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python字符串拼接、截取及替换方法总结分析

    Python字符串拼接、截取及替换方法总结分析

    这篇文章主要介绍了Python字符串拼接、截取及替换方法,结合实例形式总结分析了Python针对字符串的拼接、截取与替换的原理与常见使用技巧,需要的朋友可以参考下
    2016-04-04
  • python slack桌面自动化开发工具

    python slack桌面自动化开发工具

    这篇文章主要为大家介绍了python slack桌面自动化开发工具使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Python基于HOG+SVM/RF/DT等模型实现目标人行检测功能

    Python基于HOG+SVM/RF/DT等模型实现目标人行检测功能

    这篇文章主要介绍了Python基于HOG+SVM/RF/DT等模型实现目标检测[行人检测],今天这里并不是说要做出怎样的效果,而是基于HOG+SVM来实践机器学习检测的流程,需要的朋友可以参考下
    2022-06-06
  • python抓取搜狗微信公众号文章

    python抓取搜狗微信公众号文章

    这篇文章主要为大家详细介绍了python抓取搜狗微信公众号文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04

最新评论