python之深浅拷贝

今天来给大家讲一下深浅拷贝,深浅拷贝需要用到copy模块,这里需要导入copy模块

import copy

今天的博客结构是这样的,先对字符串和数字这两种类分别使用赋值、浅拷贝、深拷贝

1、首先来看下赋值的方法

a1 = "abc"
a2 = "123"
b1 = a1
b2 = a2

print(id(a1),id(b1),sep="/",end="\n")
# 27299360/27299360
print(id(a2),id(b2),sep="/",end="\n")
# 30486656/30486656
b1 = "add"
b2 = "789"
print(b1,a1)
# add abc
print(b2,a2)
# 789 123

2、在来看下浅拷贝的方法

a3 = copy.copy(a1)
a4 = copy.copy(a2)
print(id(a3),id(a1),sep="/",end="\n")
# 7179808/7179808
print(id(a4),id(a2),sep="/",end="\n")
# 7876736/7876736

a3 = "had"
a4 = "678"
print(a3,a1)
# had abc
print(a4,a2)
# 678 123

3、最后在看下深拷贝的方法

a5 = copy.deepcopy(a1)
a6 = copy.deepcopy(a2)
print(id(a5),id(a1),sep="/",end="\n")
# 26840608/26840608
print(id(a6),id(a2),sep="/",end="\n")
# 27537536/27537536

a5 = "def"
a6 = "456"
print(a5,a1)
# def abc
print(a6,a2)
# 456 123

结论:对于字符串和数字无论是赋值,浅拷贝,深拷贝,均对原来的变量没有影响

在来看下赋值,浅拷贝,深拷贝对列表和字典的影响,其实上述对list和dict的影响是一样的

首先我们用list来举例,先说下一个没有嵌套的list

1、先说下赋值

l1 = ["a","b","c"]

l2 = l1
print(id(l1),id(l2),sep="/",end="\n")
# 30744488/30744488

l2.append("d")
print(l2,l1,sep="/",end="\n")
# [‘a‘, ‘b‘, ‘c‘, ‘d‘]/[‘a‘, ‘b‘, ‘c‘, ‘d‘]
print(id(l1),id(l2),sep="/",end="\n")
# 28516264/28516264

2、在来看下浅拷贝

l1 = ["a","b","c"]
l2 = copy.copy(l1)
print(id(l1),id(l2),sep="/",end="\n")
# 30892240/30893000
l2.append("d")
print(l1,l2)
# [‘a‘, ‘b‘, ‘c‘] [‘a‘, ‘b‘, ‘c‘, ‘d‘]
print(id(l1),id(l2),sep="/",end="\n")
# 31088848/31089608

3、最后在来看下深拷贝

l1 = ["a","b","c"]
l2 = copy.deepcopy(l1)
print(l1,l2)
# [‘a‘, ‘b‘, ‘c‘] [‘a‘, ‘b‘, ‘c‘]
print(id(l1),id(l2),sep="/",end="\n")
# 28450728/28467408

l2.append("d")
print(l1,l2)
# [‘a‘, ‘b‘, ‘c‘] [‘a‘, ‘b‘, ‘c‘, ‘d‘]
print(id(l1),id(l2),sep="/",end="\n")
# 28712872/28729552

结论:对于没有嵌套的list或者字典,如果使用赋值的方法,修改一个变量会对另外一个变量有影响,对于深拷贝和浅拷贝,修改一个变量,对另外一个变量是没有影响

然后我们在用有嵌套的字典来看下

1、

d1 = {"k1":"v1","k2":"v2","k3":["a","b","c"]}

d2 = d1
print(id(d1),id(d2))

# 27455632 27455632

d2["k1"] = "V1"
print(d2,d1)

# {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]}print(id(d1),id(d2))

# 27127952 27127952

d2["k3"][0] = "A"
print(d1,d2)
# {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘A‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘A‘, ‘b‘, ‘c‘]}

print(id(d1),id(d2))

# 26931344 26931344

2、在来看下浅拷贝

d1 = {"k1":"v1","k2":"v2","k3":["a","b","c"]}
d2 = copy.copy(d1)
print(id(d1),id(d2))
# 27455680 27831392

d2["k1"] = "V1"
print(d1,d2)
# {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]}
print(id(d1),id(d2))

# 7205056 7253088

d2["k3"][0] = "A"
print(d1,d2)
# {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘A‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘A‘, ‘b‘, ‘c‘]}
print(id(d1),id(d2))
# 26931392 29797472

3、最后在看下深拷贝

d1 = {"k1":"v1","k2":"v2","k3":["a","b","c"]}
d2 = copy.deepcopy(d1)
print(id(d1),id(d2))
# 27586704 30576880
print(d1,d2)
# {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]} {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]}

d2["k1"] = "V1"
print(d1,d2)
# {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]}
print(id(d1),id(d2))
# 27062416 28348656

d2["k3"][0] = "A"
print(id(d1),id(d2))
# 27193488 28152048
print(d1,d2)
# {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘a‘, ‘b‘, ‘c‘]} {‘k1‘: ‘V1‘, ‘k2‘: ‘v2‘, ‘k3‘: [‘A‘, ‘b‘, ‘c‘]}

  结论:对于赋值的方法,无论是修改第一层的值,还是第二层的值,均会对另外一个变量有影响;对于浅拷贝,修改第一层的值对另外一个变量没有影响,但是修改第二层的值,则会同步修改原来的变量;对于深拷贝,无论是修改第一层还是第二层甚至是更多层,都对原来的变量没有任何影响

时间: 2025-01-01 20:56:00

python之深浅拷贝的相关文章

针对Python的深浅拷贝问题

前些天做了个小程序,遇到了Python的深浅拷贝问题 感觉自己基础不够扎实,就翻了翻教程,真的是非常基础的知识...(各位大佬下手轻点2333) 下面简单说说: 首先有个字典a 1 a = {'A':1,'B':2,'C':3,'D':4} 然后我们把它赋值给另外一个空字典b 1 b = {} 2 b = a 当我们输出b时,可以看到a和b直观上看好像是相等了 按照常理,我们会认为a和b现在是两个值相等的字典,如果我们对其中一个操作,另外一个应该不会受到影响才对,所以我们试一下: 我们尝试删除b

python之深浅拷贝(基础四)

第六章python之深浅拷贝(基础四) 6.1 小数据池 小数据池就是Python中一种提高效率的方式,固定数据类型使用同一个内存地址 小数池 -- 支持: str,int,bool a = 1 b = 1 id 查看空间的内存地址 获取开辟空间的一种地址 print(id(a)) print(id(b)) 小数据池数字支持范围: -5 ~ 256 *记住 a = 300 b = 300 print(id(a)) print(id(b)) 代码块: 一个文件,一个模块,一个函数,一个类,终端中每

【python之路13】python的深浅拷贝

深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import copy # ######### 数字.字符串 ######### n1 = 123 # n1 = "i am alex age 10" print(id(n1)) # ## 赋值 ## n2 = n1 print(id(n2)) # ## 浅拷贝 ## n2 = copy.copy(

python 赋值 深浅拷贝

深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import copy # ######### 数字.字符串 ######### n1 = 123 # n1 = "i am alex age 10" print(id(n1)) # ## 赋值 ## n2 = n1 print(id(n2)) # ## 浅拷贝 ## n2 = copy.copy(

python笔记--深浅拷贝

深浅拷贝 1.对于数字.字符串和元组而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址,例如: >>> n1=123 >>> import copy >>> n2=n1    #赋值 >>> print(id(n2)) 31427456 >>> print n2 123 >>> n2=copy.copy(n1)    #浅拷贝 >>> print(id(n2)) 314

Python 的深浅拷贝 终于明白了

python 深浅拷贝不之前一直不太理解,只是概念性的理解像 1,2 所说,敲完下面代码希望你可以理解. 1.copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 >>> import copy >>> l1 = [1,3,5,['a','b','c']] >>> a = l1 >>> b = copy.copy(a) # 浅拷贝 >>>

我要学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入门-深浅拷贝

首先我们在这里先补充一下基础数据类型的一些知识: 一.循环删除 1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题: 有这样一个列表: lst = ['周杰伦','周润发','周星驰','刘德华'] 如果现在要求我们删除带'周'的元素,我们下意识会这样做: lst = ['周杰伦','周润发','周星驰','刘德华'] for i in lst: if '周' in i: lst.remove(i) print(lst) #['周润发', '刘德华'] 但是结果却

Python的深浅拷贝

Python深浅拷贝 一丶引言 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 针对该列表 11 = ['a','b','c',['d','e','f']] 一般有三种方法,分别为:拷贝(赋值).浅拷贝.深拷贝 注意:拷贝/浅拷贝/深拷贝 都是针对数据可变类型数据而言的 1.1丶可变or不可变 id不变值可变,即在原值的基础上修改,则为可变数据类型:值变id也变,即重新申请一个空间放入新值,则

python(3)-深浅拷贝

import copy copy.copy()    浅拷贝 copy.deepcopy()   深拷贝 >>> import copy >>> a1 = 123 >>> a2 = a1 >>> a3 = copy.copy(a1) >>> a4 = copy.deepcopy(a1) >>> print(id(a1),id(a2),id(a3),id(a4)) 1967314832 1967314