Python的可变类型和不可变类型

前言

在编程语言中,数据类型是一个非常重要的概念。在 Python 中,数据类型分为两类:可变类型和不可变类型。理解这两类数据类型之间的区别及其使用场景,对于编写高效和可靠的代码至关重要。

什么是可变类型和不可变类型

可变类型

可变类型是指其值可以直接修改的类型。对这些对象的任何修改都会直接影响到原有的对象。在 Python 中,常见的可变类型包括:

  • 列表(list)
  • 字典(dict)
  • 集合(set)

下面以列表为示例,看一下可变类型特性


lst1 = [1,2,3]
lst2 = lst1
lst1.append(4)
print(lst1) #输出 [1,2,3,4]
print(lst2) #输出 [1,2,3,4]

if lst1 is lst2:
    print(True) #输出 True
else:
    print(False)

print(id(lst1)) # 输出 2524241238720
print(id(lst2)) # 输出 2524241238720


我们定义了一个lst1的列表,然后将lst1赋值给lst2,然后在lst1追加一个元素后

  • 发现lst2也同样追加了一个元素
  • 使用is判断,输出True(is比较对象的内存地址)
  • 打印两个对象的id,两者相同

这说明,lst1和lst2引用的是同一个地址,将lst1赋值给lst2,相当于在同一个箱子上,在打上一个标签,在后面的操作过程中,并没有发生内存拷贝,可变类型的赋值,可以理解为,两个对象其实是就是同一个对象。

什么是不可变类型

不可变类型是指一旦创建,其值就不能改变的类型。任何对这些对象的修改都会创建一个新的对象,而不是在原来的对象上进行修改。在 Python 中,常见的不可变类型包括:

  • 数字类型(int, float, complex)
  • 字符串(str)
  • 元组(tuple)
  • 冻结集合(frozenset)
  • 布尔值(bool)

下面以数字类型为示例,看一下不可变类型的特性


a = 10
b = a

print(id(a)) # 2478128497168
print(id(b)) # 2478128497168

a = a + 5
print(a) # 15
print(b) # 10

print(id(a)) # 2478128497328
print(id(b)) # 2478128497168

我们将 a 初始化为 10,然后将a 赋值给b,在操作中,会发现

  • 当a没有发生更新新,a和b的id一样,说明此时a和b引用了相同的地址
  • 当a更新后,b的id还是原来的,但a发生的变化,说明a和b引用了不同的地址,a的id发生了变化,说明对a的操作,产生了内存拷贝,相当于a标签,从一个箱子上取下来,贴到了一个新的箱子上面

可变类型和不可变类型的实际应用

性能考虑

由于不可变对象在修改时会创建新的对象,因此在需要频繁修改数据的场景下,使用不可变类型可能会带来性能开销。相反,可变类型允许就地修改数据,通常会有更好的性能表现

安全性和并发编程

不可变对象由于其值不能改变,因此在多线程环境下是安全的。多线程访问同一个不可变对象时,不需要担心数据竞争和同步问题。这使得不可变对象在并发编程中非常有用。

数据完整性

在某些场景下,我们希望确保数据不被修改。例如,在函数调用中传递参数时,可以使用不可变类型来避免参数在函数内部被意外修改。

总结

理解 Python 中的可变类型和不可变类型是编写高效、可靠代码的基础。不可变类型提供了数据的安全性和完整性,而可变类型则提供了灵活性和性能优势。在实际编程中,根据具体需求选择合适的数据类型,能够帮助我们更好地解决问题。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值