python深浅拷贝原理

一、对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址,不会重复在内存中开辟空间。(如下图,简要分析)
 1 #对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址
 2 import copy
 3 a1 = 123123
 4 b1 = 123123
 5 print(id(a1))
 6 print(id(b1))   #赋值相同的两个变量,内存地址一样
 7 a2 = a1         #赋值,内存地址一样
 8 print(id(a2))
 9 a3 = copy.copy(a1)
10 print(id(a3))   #浅拷贝,内存地址也一样
11 a4 = copy.deepcopy(a1)
12 print(id(a4))   #深拷贝,内存地址一样
13
14 #输出结果:
15 4985344
16 4985344
17 4985344
18 4985344
19 4985344
二、对于元组、列表、字典等来说

赋值,只是创建一个变量,该变量指向原来内存地址;

1 #赋值
2 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
3 n2 = n1         #赋值,内存ID是一样的
4 print(id(n1))
5 print(id(n2))
6
7 #执行结果:
8 8430056
9 8430056

浅拷贝,在内存中只额外创建第一层数据,值的存放位置不变;

#浅拷贝
import copy
n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
n3 = copy.copy(n1)   #浅拷贝,额外创建第一层(内存ID改变,指向值不变)
print(id(n1))
print(id(n3))
print(id(n1["k3"]))    #值指向内存地址是一样的
print(id(n3["k3"]))

#执行结果:
5022184
5549032
6362456
6362456

深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。

 1 #深拷贝
 2 import copy
 3 n1 = {"k1":"v1","k2":"222","k3":["repo",234]}
 4 n4 = copy.deepcopy(n1)    #深拷贝,所有重新创建一份(内存ID改变)
 5 print(id(n1))
 6 print(id(n4))
 7
 8 #执行结果:
 9 6791656
10 6791896
应用:
 1 #应用,浅拷贝,改变新文件,旧文件跟着改变
 2 import copy
 3 dic = {
 4     "cpu":[80,],
 5     "mem":[80,],
 6     "disk":[80,]
 7 }
 8 print("before",dic)
 9 new_dic = copy.copy(dic)   #浅拷贝后,改变新文件,连带旧文件一起改变了
10 new_dic["cpu"][0] = 50
11 print(dic)
12 print(new_dic)
13
14 #执行结果:
15 before {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [80]}
16 {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [50]}
17 {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [50]}
 1 #应用,深拷贝,改变新文件,旧文件不会改变
 2 import copy
 3 dic = {
 4     "cpu":[80,],
 5     "mem":[80,],
 6     "disk":[80,]
 7 }
 8 print("before",dic)
 9 new_dic = copy.deepcopy(dic)   #深拷贝后,改变新文件,旧文件不会改变
10 new_dic["cpu"][0] = 50
11 print(dic)
12 print(new_dic)
13
14 #执行结果:
15 before {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [80]}
16 {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [80]}
17 {‘mem‘: [80], ‘disk‘: [80], ‘cpu‘: [50]}
 

时间: 2024-12-09 22:24:28

python深浅拷贝原理的相关文章

python 深浅拷贝 进阶

主要理解新与旧到底在哪里 这样也就理解了 深浅拷贝 先说说赋值,其实python中的赋值其实是赋值了一个引用,例如: foo1=1.0 foo2=foo1 用操作符is判断时,你可以发现结果是true,是因为python是先创建了一个对象1.0,然后这个对象的引用又被赋值给了foo1和foo2,但是如果是这样: foo1=1.0 foo2=1.0 这时你会发现,这其实是创建了两个不同的对象,用内建函数id()可以发现,二者的身份不同: 其实python还有一个特例,例如: a=1 b=1 你会发

Python开发【第二章】:Python深浅拷贝剖析

Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 创建列表变量Alex,变量包含子列表,通过变量Alex给变量lzl赋值,对

8.6(数据类型分类,python深浅拷贝,异常处理,基本的文件操作,绝对路径和相对路径)

数据类型分类 按照存值个数: 存一个值:整型/浮点型/字符串 存多个值:列表/字典/元组/集合 按照有序和无序: 有序:字符串/列表/元组 无序:字典/集合 按照可变和不可变 可变:字典/列表/集合 不可变:整型/浮点型/字符串/元组 Python深浅拷贝 # 拷贝 赋值 # lt = [1,2,3] # lt2 = lt # lt.append(4) # print(lt) # print(lt2) # 列表为可变类型,所以lt的值变化,lt2的值也会跟着变化 # 浅拷贝 # import..

我要学python之深浅拷贝原理

前言 在c++中参数传递有两种形式:值传递和引用传递.这两种方式的区别我不在此说,自行补上,如果你不知道的话.我先上python代码,看完我们总结一下,代码如下: # copy module import import copy # number and string a = 12 a1 = a a2 = copy.copy(a) a3 = copy.deepcopy(a) # look addr print("==========number=======") print(id(a)

Python深浅拷贝

深浅拷贝 深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表.元组.字典等其他数据类型. 数字和字符串 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址. # 导入copy模块>>> import copy# 定义一个变量var1>>> var1 = 123# 输出var1的内存地址>>> id(var1)1347747440>>> var2 = var1# var2的内存地址和var1相同

Python 深浅拷贝 (Shallow copy and Deep copy in Python)

前言 昨天刷公众号看到一篇描述py优雅语法的文章,心痒之下到家就开始尝试,学习了for else statement,yield和py版三目写法.在列表切片这部分中,对作者的列表拷贝写法,有些不太理解. # 拷贝 copy_items = items[::] 或者 items[:] 尝试 首先开一个python,随便建一个列表l=[1,2,3]将其进行两种方法的拷贝: 我的写法 c=l 作者的写法 d=l[:] 分别打印了c和d,并没有什么差别,仔细斟酌了一下作者的用意,觉得应该有一些深层次的考

python深浅拷贝以及数据在内存中储存方法

要搞懂深浅拷贝,首先要明白数据在内存里的储存方法. 一个变量的储存,首先是变量名加上储存内容的ID,通过ID去找到变量名所对应的内容, 当我们对数据进行赋值时,其实是把内容的整体地址赋给别的变量名(相当于复制一层ID) 然而当使用浅copy时,相当于把整体内容的地址与内容中第一层地址给复制(相当于复制两层ID) 应用:直接在变量名后加一个.copy(),或import调用copy模块使用模块中的方法copy.copy() 深度拷贝,其实是复制的整体以及整体内的所有ID(复制所有层ID) 方法是用

python深浅拷贝,集合以及数据类型的补充

1.基础数据类型的补充 1.元组 如果元组中只有一个数据,且没有逗号,则该'元组'与里面的数据的类型相同.如: 1 tu = (1) 2 tu1 = (1,) 3 tu2 = ('alex') 4 tu3 = ([1,2,3],) 5 print(tu,type(tu)) # 1 <class 'int'> 6 print(tu1,type(tu1)) # (1,) <class 'tuple'> 7 print(tu2,type(tu2)) # alex <class 's

python深浅拷贝的理解和区分

1 import copy 2 3 a1 = ['s1','s2','s3'] 4 5 #可变数据类型 6 a = [1,2,a1] 7 8 b = a 9 a1.append('s4') 10 #浅拷贝 11 c = copy.copy(a) 12 #深拷贝 13 d = copy.deepcopy(a) 14 15 #可变数据类型打印 16 print('值打印----:') 17 print(a1) 18 print(a) 19 print(b) 20 print(c) 21 print(