本次文章要给大家讲解的是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对象怎么复制代码_一聚教程网相关推荐

  1. 如何批量在文件夹中建立php,怎么批量创建文件夹_一次性创建多个文件夹方法_一聚教程网...

    相信大家在平时的工作或是生活中,经常会遇到需要创建多个文件夹的问题,那么对于这种一次性创建多个文件夹的问题怎么解决呢?这里文章就给大家具体介绍下批量创建多个文件夹的问题,感兴趣的一起来了解下. 日常工 ...

  2. 计算机中如何美化表格,Excel 2016怎么美化表格_Excel 2016表格美化方法_一聚教程网...

    对于制作好的工作表,还可通过设置条件格式.表格样式.单元格样式.设置工作表背 景和应用主题等对单元格进行美化操作,使制作的表格更美观. 表格美化方法如下: 1.使用条件格式 条件格式是根据设置的条件, ...

  3. php用什么上传代码,php常用文件怎么上传_PHP常用文件上传代码_一聚教程网

    在PHP的使用中,它有着非常方便的操作设计,这次文章就给大家介绍下怎么使用PHP实现常用文件上传,相信这也是大多数人会遇到的问题,下面我们具体看看上传方法. _path = $path; $this- ...

  4. Python学习:Python中参数传递,是值传递,引用传递or其它

    本博客主要学习python参数传递机制,了解python的参数是如何传递的.学过其它语言如(C,C++),都知道参数传递有值传递和引用传递,python的参数传递属于哪种? 一.值传递和引用传递 值传 ...

  5. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传 ...

  6. python中0和1可以表示真假吗_python 对象真假值的实例(哪些视为False)

    对于python语言的True和False我们并不陌生了,在学习的过程中常会遇到这样的返回值,那么True真和False假的具体含义是什么? 本文就为大家来说说python中真假的含义. 真和假的概念 ...

  7. python中split的用法取第二个分片_python中split()函数的用法

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(li ...

  8. python中for循环和while循环的区别_python中while循环和for循环的定义和详细的使用方法...

    1.循环的定义,反复做某事,具有明确的开始和结束. 2.在Python中循环有while和for两种方式: While循环:1)语法结构 >>> while 条件: ... 需要循环 ...

  9. python中的可变数据类型有列表和元组_Python中列表的 += 和 .extend() 的异同

    一道Python题 最近有朋友"考"了我一个Python的题:使用+=和.extend()两种方法扩展元组中的列表会发生什么.虽然我对Python中的可变数据类型.不可变数据类型的 ...

最新文章

  1. 数据科学干货分享来了!
  2. MySQL8索引篇:性能提升了100%!!
  3. VC env.Please set `DISTUTILS_USE_SDK=1`
  4. chvg改变vg中LV的数量
  5. 详解布隆过滤器的原理、使用场景和注意事项
  6. SHADER 用 step替代 if-else
  7. mysql insert执行过程_MySQL · 源码分析 · 一条insert语句的执行过程
  8. kbengine连接mysql报错
  9. 使用方法 yii_如何实现高速卷积?深度学习库使用了这些黑魔法
  10. 什么是SQL Server GETDATE()函数?
  11. 什么是Maven以及Maven的优点有哪些?
  12. Go语言基础之10--面向对象编程2之方法
  13. 通过实验来比较git merge --no-ff 与--ff 和--squash的区别
  14. 自动开关机软件哪个好?自动开关机软件盘点
  15. smartadmin mysql_Smart Admin
  16. 视频编码格式、视频码率、视频帧率、分辨率的概念
  17. ABAQUS中的非线性分析
  18. 机器学习时代三大神器GBDT(MART)、XGBoost、LightGBM
  19. PHP在线网课问答题库搜索,推荐一个大学mooc网课答案题库在线查询公众号
  20. Vue验证手机号的同时验证座机号

热门文章

  1. Wisconsin Squares [USACO]
  2. JVM内存溢出时快照转存HeapDump到文件
  3. .NET 二维码生成(ThoughtWorks.QRCode)
  4. SQL查询优化《三》:少做重复的工作
  5. LoadRunner培训初级教程
  6. Silverlight 4之旅(三)数据绑定(中)
  7. 处理Excel,填充空白区域
  8. 让互联网助小组合作一臂之力
  9. 《STL源码剖析》相关面试题总结
  10. oracle rac维护命令,2015年oracle rac日常基本维护命令.doc