python变量分可变和不可变

在Python中,数据类型可以分为可变类型和不可变类型。了解这两种类型的区别对于编写高效的代码非常重要

不可变类型(Immutable Types)

不可变类型指的是在创建后其内容不能被修改的数据类型。如果对不可变类型的对象进行修改操作,实际上会创建一个新的对象,而不是修改原有的对象。

数字类型:包括整数(int)、浮点数(float)和复数(complex)。

x =  10
print(id(x))
x = x + 5  # 重新赋值,会创建一个新的整数对象,并将其赋值给 x
print(id(x))

字符串(str:字符串一旦创建,就不能更改其内容。

s = "hello"
print(id(s))
s = s + " world"  # 创建一个新的字符串对象并赋值给 s
print(id(s))

元组(tuple:元组中的元素一旦确定,就不能被修改。

t = (1, 2, 3)
t[0] = 10  # 元组是不可变的,不能修改元素,会报错 TypeError: 'tuple' object does not support item assignment

布尔类型(bool:布尔值只能是TrueFalse,不可更改。

冻结集合:frozenset 是不可变版本的集合,一旦创建,无法修改其元素。

fs = frozenset([1, 2, 3])
# fs.add(4)  # 会抛出 AttributeError: 'frozenset' object has no attribute 'add'

可变类型(Mutable Types)

可变类型指的是在创建后其内容可以被修改的数据类型。对可变类型对象的操作直接修改其内容,而不创建新的对象。

  • 列表(list:列表中的元素可以被添加、删除或修改。
  • 字典(dict:字典中的键值对可以被添加、删除或修改。
  • 集合(set:集合中的元素可以被添加或删除。
  • 字节数组(bytearray:字节数组可以被修改。
  • 自定义对象:自定义类的实例如果没有在类中明确限制其属性,可以修改实例的属性值,因此对象实例也是可变的。
class MyClass:
    def __init__(self):
        self.value = 0

obj = MyClass()
obj.value = 10  # 修改对象的属性

区别

在Python中,数据类型可以根据其值是否可以在创建后被修改来分为可变类型(Mutable Types)和不可变类型(Immutable Types)。以下是两者的区别:

可变类型(Mutable Types)

  • 定义:可变类型是指在创建后,可以修改其内容,而不需要创建一个新的对象。
  • 示例
    • 列表(list):可以添加、删除或修改元素。
    • 字典(dict):可以添加、删除或修改键值对。
    • 集合(set):可以添加或删除元素。
  • 特性
    • 可以直接修改其内容。
    • 通常占用更多的内存,因为这些对象需要支持动态修改。
    • 在函数调用中,传递的是对象的引用,因此函数内部对可变对象的修改会影响到函数外部的对象。

不可变类型(Immutable Types)

  • 定义:不可变类型是指在创建后,其内容不能被修改。任何对不可变对象的操作都会返回一个新的对象。
  • 示例
    • 整数(int)
    • 浮点数(float)
    • 字符串(str)
    • 元组(tuple)
  • 特性
    • 内容一旦创建就不能更改。
    • 由于不可变性,这些对象通常更高效,尤其是在多线程环境中,因为它们不需要锁机制来保护数据一致性。
    • 在函数调用中,传递的是对象的副本(对于基本数据类型),因此函数内部对不可变对象的操作不会影响到函数外部的对象。

实际应用

理解可变类型和不可变类型的区别对于编写高效且正确的Python代码非常重要。例如,在需要避免意外修改的情况下,使用不可变类型可以保证数据的安全性。而在需要频繁修改数据的情况下,使用可变类型可以提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值