ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【进阶09】【自学笔记】Python 对象赋值、浅拷贝和深度拷贝解析

2022-04-02 14:34:33  阅读:168  来源: 互联网

标签:old 进阶 Python list 对象 new 拷贝 id


一、定义:

  • 对象赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):浅拷贝会创建一个新对象,该新对象存储原始元素的引用

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,创建一个新对象,且存储的对象引用也是新的,会把所有子元素对象也复制生成一个新对象

二、名词解释

  • 变量:存储对象的引用
  • 对象:会被分配一块内存,存储实际的数据,比如字符串、数字、列表
  • 引用:变量指向对象,可以理解为指针

三、浅拷贝实例:

import copy

chen_list = [[1, 2], [3, 4]]
new_list = copy.copy(chen_list)

chen_list[0][1]+=98
new_list[1][1]+=96

print("chen list:", chen_list, "id is :", id(chen_list))
print("New list:", new_list, "id is :", id(new_list))

执行结果:

>说明:

浅拷贝后的会产生一个新的对象:

  1. 虽然 chen_list 和 new_list 存储的值是相同的,但浅拷贝的操作是产生了一个新的对象
  2. 所以 chen_list 和 new_list 指向的对象并不是同一个
  3. 修改可变对象的时候,新对象的值也会被同步修改,因为新旧列表对象的元素的引用是指向同一个内存地址

四、深拷贝实例:  

# 深拷贝
import copy
old_list = [[1, 2], [3, 4]]
new_list = copy.deepcopy(old_list)

old_list[0][0] += 99
old_list[1][0] += 97

print("Old list:", old_list, "old list id:", id(old_list), " old list[0] id:", id(old_list[0]))
print("new list:", new_list, "new list id:", id(new_list), " new list[0] id:", id(new_list[0]))

 执行结果:

>说明:

  1、创建一个新对象,且存储的对象引用也是新的

  2、可变对象元素(子对象)的内存地址也是不同的

面试题:浅拷贝、深拷贝的区别
1、浅拷贝和深拷贝只有在可变对象才会生效,不可变对象的赋值操作、浅拷贝、深拷贝的效果是一样的
2、浅拷贝会将对象复制生成一个新对象,但新对象仍然存储原始对象的引用,当原始对象是可变对象,然后修改它的值时,新旧对象会同时改变
3、深拷贝不仅会将对象复制生成一个新对象,且所有原始对象都会复制生成新对象,即使原始对象是可变对象,新对象存储的对象引用也是新的,所以改变旧对象的可变对象时,不会影响新对象

  

 

 

标签:old,进阶,Python,list,对象,new,拷贝,id
来源: https://www.cnblogs.com/xfbk/p/16089842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有