深入浅出讲解Python中的可变类型与不可变类型,以及赋值,浅拷贝与深拷贝的区别

文章详细介绍了Python中的不可变数据类型(如整型、浮点型、字符串、元组)和可变数据类型(如列表、字典、集合),并讨论了赋值操作符、浅拷贝`copy()`和深拷贝`deepcopy()`的区别。在不可变数据类型中,改变变量值会创建新对象,而可变数据类型则在原地修改。此外,文章还解释了Python的内存管理和垃圾回收机制,以及如何影响可变和不可变对象的行为。


在Python中,数据类型主要分为可变数据类型和不可变数据类型。主要的区别在于可变数据类型的值可以改变,而不可变数据类型的值 一旦创建就不能更改。

在这里插入图片描述
在实际开发过程中,很多时候由于对可变数据集类型与不可变数据类型的疏忽也会导致一些较难排查的bug。

所以这里一个关键的点在于,不可变数据类型在变量创建了之后,这个值就存在了这个地址块中,就不能被改变了,你即使再给同一个变量更新值,那这个值也是重新开辟了一个内存空间存放地址。

不可变数据类型

  • 数值类型:int, float, complex, bool
  • 字符串类型:str
  • 元组:tuple

可变数据类型

  • 列表:list
  • 字典:dict
  • 集合:set

1、不可变数据类型

我们通过输出一部分例子来观察不可变数据类型

# 数字
x = 10
print(id(x))  # 输出x的内存地址
x = 20
print(id(x))  # 输出新的x的内存地址

# 字符串
s = 'hello'
print(id(s))
s = 'world'
print(id(s))

# 元组
t = (1, 2, 3)
print(id(t))
t = (4, 5, 6)
print(id(t))

大家可以执行上面这段代码,会发现每次的值都会是不一样的。这就是我们说的不可变数据类型


这个时候就出现了另一个问题,此时我的变量x获得了一个新的地址,原来的那个地址怎么办呢?
在Python中,每当我们创建一个新的对象(比如一个数字或者字符串),Python就会在内存中为这个对象分配一块新的地址。当我们更改变量x的值时,实际上Python会在内存中为新的值(比如数字20)分配一块新的地址,并将变量x指向这个新的地址。此时,变量x不再指向原来的地址(数字10的地址)。

至于原来的内存地址(存放数字10的那块内存)是否还在,这取决于是否还有其他变量在引用这块内存。如果还有其他变量引用,那么这块内存就会被保留;如果没有其他变量引用,那么Python的垃圾回收机制将会自动回收这块内存,释放内存资源。所以在你的例子中,如果没有其他变量引用数字10,那么数字10所在的内存就会被垃圾回收。这也是python垃圾回收中,我们通常所说的引用-计数原理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demonslzh6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值