Python深浅拷贝的理解

yizhihongxing

1.拷贝

拷贝实际上其实就是在赋值,比如我们有一个列表L1,定义另一个列表L2引用列表L1,实际上就是在拷贝列表L1的值,由于由于L1列表是可变的数据类型,所以当L1的值变的时候,L2的值也是在跟着变的.那其实就算L1内的是不可变的数据类型,L1的内容变化,L2的内容也一样会随之变化的

# # 拷贝(赋值)
# Python学习交流QQ群:153708845
lt = [1, 2, 3]
lt2 = lt

lt.append(4)
print(lt)
# [1, 2, 3, 4]
# 因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化
print(lt2)
# [1, 2, 3, 4]

2.浅拷贝

浅拷贝时,我们时需要在写代码前import.copy,导入copy的方法,其实列表在内存空间里是以索引的形式存在的,索引指向的才是对应的具体的值,那当我们用L2去copy列表L1的时候,那他们两个列表的索引只想的值都是一样的,如果L1的某一索引对应的值有变化的时候,L2这个列表是否变化是取决于L1列表变化的那个索引的值是否为可变化数据类型。也就是说当L1列表内的数据是可变化类型的化,L2会随之变化:L1列表内的数据是不可变的数据类型,那L2列表的数据则不会跟着变化。

# 浅拷贝
# copy.copy()
import copy

l1 = ['xichen','nick','egon',['rockey','pilipili']]
l2 = copy.copy(l1)
l1.append('xuchen')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili'], 'xuchen'] 
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili']]

l1[-1].append('xucheng')
print(l1)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]
print(l2)
# ['xichen', 'nick', 'egon', ['rockey', 'pilipili', 'xucheng']]

3.深拷贝

深拷贝和浅拷贝一样,在写代码之前需要import.copy导入copy的方法,但是我们深拷贝的时候用的是deepcopy,其他的语法和浅拷贝是一样的,但是深拷贝和浅拷贝不一样的是,深拷贝不管列表L1里面的内容是可变还是不可变的,当L1变化的时候,L2列表里面的数据都不会改变的

import copy
lt = [1000, 2000, 3000, [4000, 5000, 6000]]
print('id(lt)',id(lt))
print('id(lt[0])', id(lt[0]))
print('id(lt[1])', id(lt[1]))
print('id(lt[2])', id(lt[2]))
print('id(lt[3])', id(lt[3]))
print('*' * 50)
# id(lt) 2608713900296
# id(lt[0]) 2608710450544
# id(lt[1]) 2608593350352
# id(lt[2]) 2608594909872
# id(lt[3]) 2608713954696
**************************************************

lt2 = copy.deepcopy(lt)
print('id(lt2)',id(lt2))
print('id(lt2[0])', id(lt2[0]))
print('id(lt2[1])', id(lt2[1]))
print('id(lt2[2])', id(lt2[2]))
print('id(lt2[3])', id(lt2[3]))
print('*' * 50)
# id(lt2) 2608713900616
# id(lt2[0]) 2608710450544
# id(lt2[1]) 2608593350352
# id(lt2[2]) 2608594909872
# id(lt2[3]) 2608713900744
**************************************************

总结:

  • 牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型
  • 拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值
  • 浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化copy.copy() 可变数据的类型中的内置方法.copy()
  • 深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变copy.deepcopy()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python深浅拷贝的理解 - Python技术站

(0)
上一篇 2023年3月31日
下一篇 2023年3月31日

相关文章

  • python去除列表中重复元素的方法

    列表中元素位置的索引用的是L.index 本文实例讲述了Python去除列表中重复元素的方法。分享给大家供大家参考。具体如下: 比较容易记忆的是用内置的set l1 = [‘b’,’c’,’d’,’b’,’c’,’a’,’a’] l2 = list(set(l1)) print (l2) 还有一种据说速度更快的,没测试过两者的速度差别 l1 = [‘b’,’…

    Python开发 2023年4月2日
    00
  • 一篇文章轻松学会python装饰器

    1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: >>> def foo(): … return 1 >>> foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够…

    Python开发 2023年4月2日
    00
  • Python学习:迭代器与生成器

    1.生成器 如果创建一个有很多元素的列表,但是只需要访问前几个元素,后面的元素占着的空间就白白浪费了 在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。 在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法 第一种方法很简单,只要把一个列表生成式的[]…

    Python开发 2023年4月2日
    00
  • python学习:重用父类功能的两种方式

    在子类派生的新方法中如何重用父类的功能方式一:指名道姓调用某一个类下的函数=》不依赖于继承关系 class OldboyPeople: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def f1(self): print(‘%s say hello’ %se…

    Python开发 2023年4月2日
    00
  • Python中struct 模块的使用教程

    1.struct 简单介绍 struct 是 Python 的内置模块, 在使用 socket 通信的时候, 大多数据的传输都是以二进制流的形式的存在, 而 struct 模块就提供了一种机制, 该机制可以将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原出原始的结构体数据 2.struct 的使用 str…

    python 2023年4月18日
    00
  • Python 避免字典和元组的多重嵌套

    一、字典、元组的多重嵌套 例 1:记录全班学生的成绩。 分析:定义一个 SimpleGradebook类, 学生名是字典self._grades的键,成绩是字典self._grades的值。 class SimpleGradebook(): def __init__(self): self._grades = {} def add_student(self,…

    Python开发 2023年4月2日
    00
  • Python在不同对象中使用 in 操作符的查找效率

    前言 在Python中 in 操作符可以用于判断某个元素是否存在于当前对象中,而对于不同的Python对象,使用 in 操作符的处理效率是不一样的。 今天我们主要针对 4 种不同的Python数据类型进行学习:list列表、tuple元组、set集合、dict字典。 测试过程 我们用于测试的 4 种Python数据类型,分别为 tmp_list 、tmp_t…

    Python开发 2023年4月2日
    00
  • Python教程:IO

    在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。 1.读文件 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部