在写python程序时,对于可变对象和不可变对象这里理解不深,导致总会犯一些细节错误。以下面的程序举例:
ab = {
'a':1, 'b':2}
list1 = []
for i in range(2,5):
ab['a'] = i
list1.append(ab)
print(list1) # [{'a': 4, 'b': 2}, {'a': 4, 'b': 2}, {'a': 4, 'b': 2}]
这段代码本以为结果应该是[{‘a’: 2, ‘b’: 2}, {‘a’: 3, ‘b’: 2}, {‘a’: 4, ‘b’: 2}],但是列表中的每一个字典里键a的值都变成了最后一次的值4。这就涉及到了python中的可变对象和不可变对象的相关知识。
首先,什么是对象呢?
在python中,一切皆对象,对象必有的三个属性:地址、类型、值
当 a=5时,其实就是一个创建和引用的过程。首先创建一个对象5,5被存在内存中,有自己独立的一块地址空间,然后a指向(引用)了5。
可变对象与不可变对象
当对象的值发生变化,但内存地址没有改变时,则说明是可变类型
当对象的值发生变化,内存地址也发生改变时,则说明是不可变类型
众所周知,python里的可变对象有:列表、字典、集合
不可变对象有:元组、字符串、数值
以下代码可以更好地解释可变对象与不可变对象:
python在引用不可变对象时,会寻找该对象是否被创建过,若该对象已创建,则变量会直接引用该对象,不会再申请新的内存空间。
<