Python中的不可变变量和可变变量&赋值、浅拷贝和深拷贝

本文深入探讨Python中不可变与可变变量的区别,通过实例解释赋值、浅拷贝和深拷贝的概念及应用场景,帮助读者理解变量的内存管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python中的不可变变量和可变变量&赋值、浅拷贝和深拷贝

不可变变量

不可变量包括:数值类型、字符串和元组。一旦被重新赋值,变量对应的内存地址就会发生改变。

可变变量

不可变量包括:列表、字典、集合。添加或者修改数据时,变量对应的内存地址不会改变。也就是可变类型,一直在引用原来的内存地址。
注意:如果是重新赋值(不是添加和修改),那地址是会改变的,引用了新的内存地址。

a = "abc"
b = "abc"
print(id(a), id(b))     #2513440771856 2513440771856

c = [1, 2]
d = [1, 2]
print(id(c), id(d))     #1961245043848 1961247346632

d = [3, 4]
e = d[:]				#切片是浅拷贝
print(id(d), id(e))     #1961247392008 1961247346632

d = [3, 4]
print(id(d))        #1961247391880  
d.append(5)
print(id(d))        #1961247391880

s = set([1, 3])
s1 = set([1, 3])
print(id(s), id(s1))    #1960972183144 1961246939848

赋值

a=b:赋值,a和b指向同一对象(或者理解为地址)。
引用大佬的一个图:
在这里插入图片描述

a = 1
b = a
print(id(a), id(b))     # 1910664208 1910664208
b = 2
print(id(a), id(b), a, b)   # 1910664208 1910664240 1 2

a_list = [1, 2, 3]
print(id(a_list), a_list)   # 2098327073416 [1, 2, 3]
a_list.append(4)
print(id(a_list), a_list)   # 2098327073416 [1, 2, 3, 4]

注意:很多同学会混淆一个概念,b=a时,b指向a指向的对象①,b=2,b就指向了另外一个对象②,这时候a是不变的,它还是指向原来的对象①,不会跟着b指向对象②!!!我以前在这个点上脑子一直转不过来。

浅拷贝

b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200730213540305.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dzZ3pqZGJi,size_16,color_FFFFFF,t_70在这里插入图片描述

a = [1, ["r", "s", "t"], 2, 3]
b = a.copy()
a.append(4)
print(id(a), id(b), a, b)   # 2281618944776 2281618944968 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't'], 2, 3]
b[1].append("全都有我")
print(id(a), id(b), a, b)   # 2281618944776 2281618944968 [1, ['r', 's', 't', '全都有我'], 2, 3, 4] [1, ['r', 's', 't', '全都有我'], 2, 3]

看完我上面的代码,其实很好理解,浅拷贝就是拷贝了最外层的一层壳,里面的还是指向同一个对象。

深拷贝

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
在这里插入图片描述

import copy
a = [1, ["r", "s", "t"], 2, 3]
b = copy.deepcopy(a)
a.append(4)
print(id(a), id(b), a, b)   # 2978778657992 2978778657672 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't'], 2, 3]
b[1].append("全都有我")
print(id(a), id(b), a, b)   # 2978778657992 2978778657672 [1, ['r', 's', 't'], 2, 3, 4] [1, ['r', 's', 't', '全都有我'], 2, 3]

深拷贝就是拷贝出来一个完全独立不受对方影响的对象。

最后感谢大佬:
这个太牛逼了,图画得清晰明了,小弟借用一下:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
https://www.cnblogs.com/andy9468/p/13021987.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值