Python 可变类型和不可变类型,以及其引用

1. 可变和不可变类型

在 Python 中,数据类型可以被分为可变和不可变类型。可变类型指的是,其内容可以被修改的类型,主要包括列表、字典和集合;不可变类型指的是,一旦创建之后就不能被修改的类型,主要包括数字、字符串和元组。

有些类型看上去像是可变的,但其实是不可变的。比如说通过“+=”来扩充一个字符串,实际上是创建了一个新的字符串。

s1 = 'hello'

s2 = s1 # s2 指向了 s1 所在的内存地址

s1 += 'world' # 创建了一个新的字符串

print(s1) # 'helloworld'

print(s2) # 'hello'

2. 可变类型的引用

2.1 列表

列表是一种可变类型,当我们修改一个列表时,实际上是对其所在的内存地址进行了操作。比如说我们向列表中添加一个元素,其实是在原有的内存地址上新增了一个空间。

lst1 = [1, 2, 3]

lst2 = lst1 # lst2 指向了 lst1 所在的内存地址

lst1.append(4) # 对 lst1 所在的内存地址进行了操作

print(lst1) # [1, 2, 3, 4]

print(lst2) # [1, 2, 3, 4],由于 lst1 和 lst2 指向同一个内存地址,所以结果也相同

2.2 字典

字典也是一种可变类型,其修改方式与列表类似,是通过原址修改的。

dic1 = {'a': 1, 'b': 2}

dic2 = dic1 # dic2 指向了 dic1 所在的内存地址

dic1['c'] = 3 # 对 dic1 所在的内存地址进行了操作

print(dic1) # {'a': 1, 'b': 2, 'c': 3}

print(dic2) # {'a': 1, 'b': 2, 'c': 3},由于 dic1 和 dic2 指向同一个内存地址,所以结果也相同

3. 不可变类型的引用

3.1 数字

数字是一种不可变类型,其值一旦创建就不可以被改变,因此当我们修改数字时,实际上是创建了一个新的对象。

n1 = 1

n2 = n1 # n2 指向了 n1 所在的内存地址

n1 += 1 # 创建了一个新的数字

print(n1) # 2

print(n2) # 1,由于 n1 和 n2 指向不同的内存地址,所以结果也不同

3.2 字符串

字符串是另一种不可变类型,其修改方式也与数字类似,是通过创建新的对象实现的。

s1 = 'hello'

s2 = s1 # s2 指向了 s1 所在的内存地址

s1 += 'world' # 创建了一个新的字符串

print(s1) # 'helloworld'

print(s2) # 'hello',由于 s1 和 s2 指向不同的内存地址,所以结果也不同

4. 总结

Python 中的可变类型和不可变类型对于内存管理有着重要的作用。对于可变类型来说,需要谨慎处理引用,避免出现意外的结果。而对于不可变类型,由于其值一旦创建就不会被改变,因此更容易理解和控制。

后端开发标签