在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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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]]

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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]

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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中对象的引用与复制相关推荐

  1. Java中对象和引用的理解

    2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...

  2. Python实训day10am【Python中的地址引用、os模块】

    Python实训-15天-博客汇总表 目录 1.Python中的地址引用 2.os模块(操作系统模块) 2.1.os案例1 2.2.os案例2 2.3.os案例3 2.4.os案例4 2.5.os案例 ...

  3. python怎么调用另一个py文件的变量,Python中py文件引用另一个py文件变量的方法

    Python中py文件引用另一个py文件变量的方法 最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requ ...

  4. python导入其他py文件-Python中py文件引用另一个py文件变量的方法

    最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requests r = requests.get(&quo ...

  5. python中对象的定义_python中对象的定义和使用

    python中对象的定义和使用 发布时间:2020-06-22 11:57:16 来源:亿速云 阅读:98 作者:Leah 今天就跟大家聊聊有关python中对象的定义和使用,可能很多人都不太了解,为 ...

  6. python中对象和变量的关系_浅析python中的类变量和对象变量

    刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['t ...

  7. PHP中对象的引用传递

    很多数据类型都可以写时复制(copy-on-write),如$a=$b,两个变量赋予的值相等. 对于对象就不一样: $box1 = new Parcel(); $box1->destinatio ...

  8. python中对象的赋值、浅拷贝和深拷贝

    1. 赋值:简单的对象引用 在python中,变量赋值实际上是简单的对象引用.在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用. (1)原 ...

  9. python中使用保留字引用当前程序以外的功能库_Python中使用_______保留字引用当前程序以外的功能库...

    [单选题]以下哪个选项不是Python语言的保留字 [简答题]用3分钟的时间尽可能多的写出你能命名的情绪 [填空题]已知列表对象 x = ['11', '2', '3'] ,则表达式 max(x) 的 ...

最新文章

  1. IDEA下spring boot项目打包war包部署外部tomcat问题
  2. 音频降噪在58直播中的研究与实现
  3. 头插法和尾插法分别建立链表(复制即可应用)
  4. 5.由键盘任意输入1个整形数据(小于10亿,位数不限),将其倒置,如:输入12345,则输出54321。
  5. Android OpenGL ES(十)绘制三角形Triangle .
  6. aesmiyao php_PHP使用AES,ECB模式块和PKCS5Padding生成对称密钥
  7. JavaScript-严格检查模式
  8. 大白话 设计模式之虚拟工厂
  9. windows下IDEA全面红色,但是能编译,不能智能提示
  10. python敏感字替换_python实现敏感词过滤的几种方法
  11. 浏览器javascript 下载m3u8视频合成mp4
  12. 利用vbs脚本实现自动发送微信消息
  13. 不容错过 食材VRay材质球素材推荐
  14. 聊聊这8种单例模式的优缺点
  15. 拉普拉斯矩阵(Laplace Matrix)与瑞利熵(Rayleigh quotient
  16. 拼图游戏-小程序游戏
  17. linux组raid的工具,Linux下MegaRAID命令行使用工具
  18. LeetCode-Python-875. 爱吃香蕉的珂珂
  19. 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
  20. Adobe软件安装错误127替代方案

热门文章

  1. session过期跳转登录页面
  2. Visual Studio “类视图”和“对象浏览器”图标含义
  3. 利用BIND 9基于电信网通智能DNS 搭建
  4. usestate中的回调函数_React Hooks 源码解析(3):useState
  5. 如何获取尚未开票信息(包括交货单、销售订单)
  6. BADI EXIT等增强报W警告类消息
  7. 取供应商客户的期初表
  8. 大象公会:如何做万人传播的原创内容?
  9. 对于按成本组件结构(要素)还原
  10. 弹出显示多条的message对话框