Cyrus Flag

flag{S0_bangbang_7ha7_u_f1nd_h3r3}

Python可变类型和不可变类型

immutable 是很多 dalao 的文章里常见的词,意思是“不可变的”。Python 中也有可变类型和不可变类型,本文简单解释它们之间的区别,辅助理解即可。
这里有两个函数:

1
2
3
4
5
6
7
8
9
def f1(x=0):
x+=1 #①
print(x)
print(id(x))

def f2(x=[]):
x.append('1') #②
print(x)
print(id(x))

运行 f1() 三次结果均为 1,但运行 f2() 三次的结果却是 [1],[1,1],[1,1,1]。
通常的解释为:int() 为不可变类型,而 list() 为可变类型。这里将两者区别用中文整理如下:

1
2
3
4
5
6
7
x = 0
x += 1
print(x)
# Output: 1x = [0]
x += [1]
print(x)
# Output: [0, 1]

两者运行时的实际状态如下图,不妨说可变和不可变是针对变量指向的实际数据而言的

程序默认会从优先从内存中查找默认值的变量及指针是否已设置,除了第一次执行函数,后两次的默认值实际是从内存中取得的。①处改变了x的指向,却未改变值为0的内存中储存的值(因为不可变);②处则没有改变x的指向(因为内存中的值可变),但改变了原值为[]的内存中的值,故输出有别。
P.S. 常见不可变类型有:
数值:int()float(), complex()
序列:str()tuple()frozenset()bytes()
其余可认为是可变类型
参考:https://stackoverflow.com/questions/8056130/immutable-vs-mutable-types