Python的赋值操作一般都是存储对象的引用,而不是对象的拷贝。因为如果直接对对象进行拷贝,那么运行将会比较缓慢,而且我们实际开发大部分场景都是希望引用对象而不是拷贝对象。当然了,如果你明确要求拷贝,那么需要明确调用拷贝相关的函数。

1 列表对象的引用与拷贝

1.1 列表对象的引用

列表对象在赋值时是引用,例如下:

a = [1, 2, 3]
b = a
b[1] = 'bitpy.cn'print("a =", a)
print('b =', b)

输出结果如下:

a = [1, 'bitpy.cn', 3]
b = [1, 'bitpy.cn', 3]

ab引用的是同一个对象,ab任何一个对象对列表内部元素修改都会影响另一个。

1.2 列表对象的拷贝

如果明确希望执行拷贝,那么只需调用列表的分片操作,分片操作执行的是对象拷贝。

a = [1, 2, 3]
b = a[:]
c = a[0 : 2]
b[1] = 'bitpy.cn'
c[1] = 'python'print("a =", a)
print('b =', b)
print("c =", c)

输出结果如下:

a = [1, 2, 3]
b = [1, 'bitpy.cn', 3]
c = [1, 'python']

除了使用切片操作外,还可以使用b=list(a)来执行拷贝操作。

1.3 列表对象的拷贝陷阱

1.2小节我们提到,使用列表的切片操作执行拷贝操作,但是这只是一个浅拷贝。什么意思呢?它只对列表内的所有元素进行拷贝,但这里会有个问题:

如果有元素是引用,那么拷贝过来的还是引用。

举个例子:a元素是二维列表,即可以看成是a是一个一维列表,其中每个元素是个一维列表对象。如果对a进行浅拷贝,那么拷贝出来的每个元素还是一维列表的引用。示例代码如下:

a = [[1, 2, 3], [4, 5, 6]]
b = a[:]
b[0][0] = 'bitpy.cn'print("a=", a)
print("b=", b)

输出结果如下:

a= [['bitpy.cn', 2, 3], [4, 5, 6]]
b= [['bitpy.cn', 2, 3], [4, 5, 6]]

可以看到b还会影响到a。此时,我们需要深拷贝来执行拷贝操作.

2 深拷贝

深拷贝可以使用标准库copy来完成。

import copya = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)
b[0][0] = 'bitpy.cn'print("a=", a)
print("b=", b)

输出结果如下:

a= [[1, 2, 3], [4, 5, 6]]
b= [['bitpy.cn', 2, 3], [4, 5, 6]]

可以看到,使用深拷贝后,ab对象是完全独立的两个对象。

3 字典对象的拷贝

字典对象的copy()函数也是浅拷贝,例如:

a = {'a':1, 'b':['python']}
b = a.copy()
b['a'] = 2
b['b'][0] = 'bitpy.cn'
print('a=', a)
print('b=', b)

上面代码可以执行基本的浅层拷贝任务,输出如下:

a= {'a': 1, 'b': ['bitpy.cn']}
b= {'a': 2, 'b': ['bitpy.cn']}

输出非常有意思,可以看到,对象非引用对象如a['a']是直接做了拷贝,而对于引用对象a[b],拷贝出来的还是列表['python']的一个引用。

字典对象的深拷贝依然可以通过copy.deepcopy函数完成:

import copy
a = {'a':1, 'b':['python']}
b = copy.deepcopy(a)
b['a'] = 2
b['b'][0] = 'bitpy.cn'
print('a=', a)
print('b=', b)

输出结果如下:

a= {'a': 1, 'b': ['python']}
b= {'a': 2, 'b': ['bitpy.cn']}

4 小结

对于一些常量如数值、字符串等,可以直接使用浅拷贝。对于一些嵌套型对象,需要使用copy.deepcopy(xxxx)来实现深拷贝。

欢迎关注我【Python学习实战】,第一时间获取最新更新。每天学习一点点,每天进步一点点。

【Python基础】对象的浅拷贝与深拷贝相关推荐

  1. 对象的浅拷贝和深拷贝

    对象的浅拷贝和深拷贝 简要介绍 代码实现 简要介绍 浅拷贝:python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象引用同一个对象 深拷贝:使用copy模块的deep ...

  2. 拷贝Python对象、浅拷贝、深拷贝

    浅拷贝和深拷贝在C++中出现和使用的较多,python也有相应的用法. test1 = ['a','c','b','d','f'] print id(test1) test2 = test1 prin ...

  3. Python基础教程:赋值、深拷贝与浅拷贝(内存地址)

    1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test():a = {}b = aprint(id(a)) # 140367329543360 a[ ...

  4. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  5. Python —对象的浅拷贝和深拷贝

    变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...

  6. Python的复制、浅拷贝、深拷贝区别和代码说明

    Python赋值 总结 一.概念解读 赋值:旧瓶装旧酒 浅拷贝:新瓶装旧酒 深拷贝:新瓶装新酒 二.实例测试 测试方法 赋值 浅拷贝 深拷贝 附录:全代码 赋值.浅拷贝.深拷贝 总结 赋值: 新建一个 ...

  7. Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数

    Python入门到实战(一) 为什么写这篇文章 Part 1 入门部分 什么是编程语言? Python的优势 目前应用 特点 Part 2 6种内置对象 1 整数.浮点数 2 字符串 3 列表 4 元 ...

  8. python—类和对象之浅拷贝和深拷贝详细讲解

    一.变量的赋值操作 定义:只是形成2个变量,实际上还是指向同一个对象 代码如下: 内存示意图: 将创建CPU类的实例对象赋值给cpu1进行储存,所以cpu1的id为0212, 然后将cpu1赋值给cp ...

  9. Python对象的浅拷贝与深拷贝

    在讲我们深浅拷贝之前,我们需要先区分一下拷贝和赋值的概念.看下面的例子 a = [1,2,3] 赋值: b = a 拷贝: b = a.copy() 上面的两行代码究竟有什么不同呢?带着这个问题,继续 ...

最新文章

  1. C语言 读取txt文档按行读取到新的txt文档
  2. java heroku_Heroku和Java –从新手到初学者,第1部分
  3. 大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?
  4. 基于Java+SpringBoot+vue+element实现校园闲置物品交易网站
  5. 使用Telnet命令收发E-mail
  6. 手把手教你学会用Delve调试Go程序
  7. service.php,service.php
  8. android_ratingbar的使用错误
  9. Mvc5 EF6 CodeFirst Mysql (一) 新建一个Mvc项目并使用EF连接到Mysql数据库
  10. python 麦克风人声检测_人声后期混音教程:13条人声处理技巧
  11. 苹果AppStore审核,技术支持网址不通过被拒绝
  12. 苹果CMS绑定分类失败,刷新就丢失!
  13. 华为5G手机+鸿蒙系统,还能这么玩儿?
  14. Photoshop使用技巧
  15. 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
  16. 数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现
  17. android系统手机流量控制方法,如何实现Android手机流量的控制
  18. 最新 RibbonCreator 2021 OFFICE功能区编辑器
  19. [PaPaPa][需求说明书][V0.1]
  20. source insight macro

热门文章

  1. Navicat重新使自增id从1开始
  2. 微信发送图文消息,查看图文media_id
  3. win7 桌面图标 计算机 灰色,笔者操作win7系统网络图标行为关闭灰色不可选的还原教程...
  4. 初识c语言—学习笔记
  5. 哪款游戏蓝牙耳机好用?好用的游戏蓝牙耳机推荐
  6. 2022新鲜出炉Android面试总结附真题+答案解析(京东、新东方、货拉拉...)
  7. php两个并排的按钮,如何并排设置2个按钮
  8. keypair java_Java KeyPairGenerator genKeyPair()用法及代码示例
  9. PyTorch 在 Windows 10 系统下的环境配置及安装
  10. pdf提取其中一页操作方法