发布时间:2022-07-06 文章分类:C+ 语言, PhotoShop教程, Python 知识 投稿人:王小丽 字号: 默认 | | 超大 打印

Python的高级特性:容易忽略的不可变类型

Python 中有一些容易忽略的不可变类型Str、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