Python中对象的引用与复制
在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中对象的引用与复制相关推荐
- Java中对象和引用的理解
2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两 ...
- 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案例 ...
- python怎么调用另一个py文件的变量,Python中py文件引用另一个py文件变量的方法
Python中py文件引用另一个py文件变量的方法 最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requ ...
- python导入其他py文件-Python中py文件引用另一个py文件变量的方法
最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requests r = requests.get(&quo ...
- python中对象的定义_python中对象的定义和使用
python中对象的定义和使用 发布时间:2020-06-22 11:57:16 来源:亿速云 阅读:98 作者:Leah 今天就跟大家聊聊有关python中对象的定义和使用,可能很多人都不太了解,为 ...
- python中对象和变量的关系_浅析python中的类变量和对象变量
刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['t ...
- PHP中对象的引用传递
很多数据类型都可以写时复制(copy-on-write),如$a=$b,两个变量赋予的值相等. 对于对象就不一样: $box1 = new Parcel(); $box1->destinatio ...
- python中对象的赋值、浅拷贝和深拷贝
1. 赋值:简单的对象引用 在python中,变量赋值实际上是简单的对象引用.在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用. (1)原 ...
- python中使用保留字引用当前程序以外的功能库_Python中使用_______保留字引用当前程序以外的功能库...
[单选题]以下哪个选项不是Python语言的保留字 [简答题]用3分钟的时间尽可能多的写出你能命名的情绪 [填空题]已知列表对象 x = ['11', '2', '3'] ,则表达式 max(x) 的 ...
最新文章
- IDEA下spring boot项目打包war包部署外部tomcat问题
- 音频降噪在58直播中的研究与实现
- 头插法和尾插法分别建立链表(复制即可应用)
- 5.由键盘任意输入1个整形数据(小于10亿,位数不限),将其倒置,如:输入12345,则输出54321。
- Android OpenGL ES(十)绘制三角形Triangle .
- aesmiyao php_PHP使用AES,ECB模式块和PKCS5Padding生成对称密钥
- JavaScript-严格检查模式
- 大白话 设计模式之虚拟工厂
- windows下IDEA全面红色,但是能编译,不能智能提示
- python敏感字替换_python实现敏感词过滤的几种方法
- 浏览器javascript 下载m3u8视频合成mp4
- 利用vbs脚本实现自动发送微信消息
- 不容错过 食材VRay材质球素材推荐
- 聊聊这8种单例模式的优缺点
- 拉普拉斯矩阵(Laplace Matrix)与瑞利熵(Rayleigh quotient
- 拼图游戏-小程序游戏
- linux组raid的工具,Linux下MegaRAID命令行使用工具
- LeetCode-Python-875. 爱吃香蕉的珂珂
- 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
- Adobe软件安装错误127替代方案