小谈Python可变对象与不可变对象

同事准备入Python坑,有点地方不理解,故写文助之。

可变对象与不可变对象

s1 = 'y'
print(id(s1))  # 45180648
s1 = s1 + 'z'
print(id(s1))  # 46573608,变化了,证明上述操作(修改操作)其实是重新开辟了一个内存地址

l1 = [1]
print(id(l1))  # 60786632
l1.append(2) # 没变,证明上述操作(修改操作)没有重新开辟新的内存空间
print(id(l1))  # 60786632

所以他们的区别就是当发生变化时,内存地址是否会重新开辟。

赋值

将一个对象的地址赋值给一个变量,让变量指向该地址,是从右往左看(读)的。

print(id('ypc'))  # 48296424
s1 = 'ypc'  # 将 48296424('ypc') 赋给s1变量, 反之就是s1 指向 48296424
print(id(s1))  # 48296424

s2 = s1  # 将48296424(s1/'ypc') 赋给s2变量, 反之就是s2 指向 48296424
print(id(s2))  # 48296424

两者结合(赋值与可变对象...)

# 不可变对象
s1 = 'ypc'
s2 = s1
print(s1, id(s1))  # ('ypc', 54404320L)
print(s2, id(s2))  # ('ypc', 54404320L)

s1 = 'zoulf'
print(s1, id(s1))  # ('zoulf', 64656500L)
print(s2, id(s2))  # ('ypc', 54404320L)
# 这里也就验证了前面不可变对象改变时,新开辟了一个内存地址


# 可变对象
l1 = [1, 2]
l2 = l1
print(l1, id(l1))  # ([1, 2], 58492872L)
print(l2, id(l2))  # ([1, 2], 58492872L)

l1.append('3')
print(l1, id(l1))  # ([1, 2, '3'], 58492872L)
print(l2, id(l2))  # ([1, 2, '3'], 58492872L)
# 这里也就验证了前面可变对象改变时,未开辟新的内存地址

# 但是注意,不可变对象的赋值操作
list1 = [1]
print(id(list1))  # 45885640
list1 = [1]
print(id(list1))  # 45886280

# 这也就说明不可变对象发生改变时,内存地址不变的情况是调用它内部的方法,如append , list1[0] = 2
# 而赋值操作,即便是同样的值,也会改变内存地址,而不可变对象不会有这种情况(赋同样值不改变内存地址)

ss1 = 'd'
print(id(ss1))  # 53641944
ss1 = 'd'
print(id(ss1))  # 53641944

你可能感兴趣的:(小谈Python可变对象与不可变对象)