Python的高级特性:容易忽略的不可变类型
发布时间:2025-09-28 11:08:14
Python 有些不可变的Strr类型容易被忽略、Integer、None、Tuple
#错误演示 In[45]:defdemo(lst=[]): ...:lst.append("hello") ...:returnlst ...: In[46]:demo() Out[46]:['hello'] In[47]:demo() Out[47]:['hello','hello']
廖雪峰的 Python 教程中提到了这一块,但并不太详细。在这里,因为 lst 而且是可变参数 demo 在初始化时 lst 参数指向一个 [] 内存空间,然后每次调用,[] 所有这些内存空间 append 一个「hello」,而由于 lst 它仍然指向这个内存空间,所以你会看到它 demo 解决函数调用问题的奇怪现象是引入不可变类型。
#正确演示 In[54]:defdemo(lst=None): ...:lst=[] ...:lst.append("hello") ...:returnlst ...: In[55]:demo() Out[55]:['hello'] In[56]:demo() Out[56]:['hello']
在正确的演示中,将 lst 初始化为 None, 这样 lst 它是一个不可变的参数,但不能直接对准 lst 直接使用 append,因为只有 list 才有 append 方法,所以需要 lst 真正的初始化 lst = []
可变类型和不可变类型是一个容易被忽视的知识点,在这里进行了深入的研究,以下是常见的不可变类型和可变类型。
不可变「mutable」类型:
int, long, float, string, tuple, frozenset
可变类型「immutable」类型:
list, dict
Python中的所有变量都是值的引用,这意味着变量通过绑定指向其值。 而且这里所说的不可变指的是值的不可变。 对于不可变类型的变量,如果需要更改变量,将创建一个新值,将变量绑定到新值,如果旧值不被引用,则等待垃圾回收。以下内容 int 和 list 分别作为代表进行解释。
#不可变类型 In[31]:id(1),id(2) Out[31]:(4477999936,4477999968) In[32]:a=1 In[33]:id(a) Out[33]:4477999936 In[34]:#当a赋予新值时,变量a将绑定到新值上 In[35]:a=3 In[36]:id(a) Out[36]:4478000000 #可变类型 In[38]:lst=[0] In[39]:id(lst) Out[39]:4493976328 In[40]:lst=[0,1] In[41]:id(lst) Out[41]:4499600328
表面上看可变类型,python 不同类型的管理模式似乎已经实现,但事实并非如此。其实 lst 代表地址,引用lst[0],lst[1]内存地址实际上已经改变了,因为lst[i]是int(这里),而int是不可变的类型。