首页 > 其他分享 >深浅拷贝

深浅拷贝

时间:2023-12-07 14:22:16浏览次数:24  
标签:对象 list 列表 深浅 print 拷贝 copy

首先需要明确一点:在什么情况下讨论深浅拷贝。对于不可变数据类型的变量不存在深浅拷贝问题。深浅拷贝讨论的对象是可变数据类型的变量,如列表、字典等。

在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于复制对象的概念。

浅拷贝创建了一个新对象,该对象与原始对象共享内部对象的引用。如果原始对象中存在可变对象(如列表、字典等),则更改拷贝对象或原始对象中的这些可变对象将相互影响。

深拷贝创建了一个全新的对象,它复制了原始对象及其所有内部对象的副本。即使原始对象中存在可变对象,深拷贝的结果也是完全独立的对象,对其中一个对象的更改不会影响另一个对象。

可以使用 copy 模块中的 copy 函数来执行浅拷贝,使用 copy 模块中的 deepcopy 函数来执行深拷贝。

import copy

# 原始列表
msg_list = [1, "小满", ["我等你到三十五岁"], {"余华": "活着"}]
print(f"原列表内的列表的内存地址: {id(msg_list[2])}")

# 浅拷贝
shallow_copy_list = copy.copy(msg_list)
print(f"浅拷贝内的列表的内存地址: {id(shallow_copy_list[2])}")

# 深拷贝
deep_copy_list = copy.deepcopy(msg_list)
print(f"深拷贝内的列表的内存地址: {id(deep_copy_list)}")

# 修改原列表的内容,观察结果
msg_list[0] = True
msg_list[2].append("什么都明白的人最温柔也最冷漠")

print()

# 打印原列表
print(f"原列表: {msg_list}")

# 打印浅拷贝结果
print(f"浅拷贝: {shallow_copy_list}")

# 打印深拷贝结果
print(f"深拷贝: {deep_copy_list}")

输出结果如下:

原列表内的列表的内存地址: 1592237873856
浅拷贝内的列表的内存地址: 1592237873856
深拷贝内的列表的内存地址: 1592237874240

原列表: [True, '小满', ['我等你到三十五岁', '什么都明白的人最温柔也最冷漠'], {'余华': '活着'}]
浅拷贝: [1, '小满', ['我等你到三十五岁', '什么都明白的人最温柔也最冷漠'], {'余华': '活着'}]
深拷贝: [1, '小满', ['我等你到三十五岁'], {'余华': '活着'}]

从输出结果可以看出,对浅拷贝对象进行修改后,原始对象也被影响到,因为它们共享了内部对象的引用。而对深拷贝对象的修改不会影响原始对象,因为它们是完全独立的副本。

补充总结

  • 深浅拷贝讨论的拷贝对象是可变数据类型;
  • 深浅拷贝的区别在于:是否区分元素的可变还是不可变类型的判断;
  • 需要有变量定义的基本知识支撑;
  • 列表的切片也是浅拷贝,copy模块的copy.copy()函数是浅拷贝操作,和列表的内置方法copy()功能相同。

友情链接

标签:对象,list,列表,深浅,print,拷贝,copy
From: https://www.cnblogs.com/ccsvip/p/17881893.html

相关文章

  • python中级之深浅拷贝
    深浅拷贝异同相同点:无论深拷贝还是浅拷贝都会创建一个新对象。即:拷贝出来的对象的id不同。不同点:浅拷贝:只拷贝了对象,对象内的元素并不会发生拷贝。深拷贝:不仅拷贝对象,对象内的元素也会发生拷贝。浅拷贝浅拷贝举例来看一个浅拷贝的例子:importcopya=[1,2,[3,4]]......
  • Python中级之深浅拷贝
    深浅拷贝Python源码对深浅拷贝的解释以下来源于Python源码中对copy的解释#英文原文Thedifferencebetweenshallowanddeepcopyingisonlyrelevantforcompoundobjects(objectsthatcontainotherobjects,likelistsorclassinstances).-Ashallowcopyco......
  • python入门之深浅拷贝】---python 深浅拷贝
    title:【python入门之深浅拷贝】---python深浅拷贝date:2023-12-0618:54:06updated:2023-12-0619:20:00description:【python入门之深浅拷贝】---python深浅拷贝cover:https://zhuanlan.zhihu.com/p/631965597https://home.cnblogs.com/u/dream-ze/【......
  • 深浅拷贝
    深浅拷贝1.浅拷贝浅拷贝是指创建一个新对象,并将原始对象的元素复制到新对象中#num_list=[1,2,[3,4]]##使用浅拷贝创建拷贝对象#copy_list=copy.copy(num_list)###修改原对象中的可变数据类型#num_list[2].append(5)##print("原对象:",num_list) #[1,......
  • 深浅拷贝问题
    深浅拷贝问题copy.copy浅拷贝copy.deepcopy深拷贝浅拷贝copy.copycopy.copy浅拷贝原来的拷贝对象------拷贝出了一个新的对象修改原对象------原对象必须改变-----新对象也会随着原对象的改变而改变。总结:复制一份原来的对象,如果原来的对象中存在可变数据类型,那么修......
  • 深浅拷贝
    深浅拷贝【1】浅拷贝使用浅拷贝创造对象,修改原来对象中的可变数据类型复制的对象也会随着原来的对象改变而改变首先,会为整数1分配一个内存空间。变量a和b都指向了这个内存空间(内存地址相等),所以他们的id相等。a=1b=1print(id(a))#2057422768print(id(b))#......
  • 浅谈深浅拷贝
    【一】深浅拷贝深拷贝(deepcopy)和浅拷贝(shallowcopy)是在Python中用于复制对象的两种方式。它们的作用如下:1.浅拷贝:浅拷贝创建一个新的对象,但是该新对象的元素是对原始对象的引用。换句话说,浅拷贝只复制了对象的引用,而不是对象本身。当原始对象中的元素发生变化时,浅拷贝的对象也......
  • 不含指针的结构体赋值实现,直接内存拷贝
    #include<stdio.h>#include<stdlib.h>structA{ intc; charb[20]; charstrs[10][10]; intk;};intmain(){ //Aa={...};//帮我初始化 structAa={ 1,//Initializecwithsomeinteger "ExampleString",//Initialize......
  • 深拷贝和浅拷贝
    在C++中,深拷贝和浅拷贝是两种不同的对象复制方式:浅拷贝:当我们创建一个对象的副本时,如果仅仅复制所有成员变量的数据,那么这就是浅拷贝。这在所有的变量都在栈内存中分配时工作得很好1。但是,如果有些变量是在堆内存中动态分配的,那么复制的对象变量也会引用同一块内存位置1。......
  • JS赋值、浅拷贝、深拷贝的区别
    在说明它们的区别之前,首先需要了解JS的数据类型和它们的存放位置。  数据类型基本数据类型:String、Number、Boolean、Undefined、Null、Symbol(es6)、BigInt(es6)引用数据类型:Object  存放位置基本数据类型是存放在栈中的数据段,直接存储的就是值本体。引用数据类型是存......