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