python 可變對象和不可變對象

python 可變對象和不可變對象

可變對象:`dict, list, set`

不可變對象:`tuple, string, int, float, bool`

這裡的可變不可變指的是內存地址中存儲的數據

可變對象

>>> a = [1]
>>> id(a)
4386390152
>>> a.append(2)
>>> a
[1, 2]
>>> id(a)
4386390152

`id()`方法返回對象的內存地址(邏輯上的地址,並不是實際物理的地址)

python 可變對象和不可變對象

從中可以看到修改列表,但是內存地址並沒有改變,說明我們將內存當中存儲的數據進行了修改

不可變對象

>>> b = 10
>>> id(b)
4384244160
>>> b = 10 + 1
>>> b
11
>>> id(b)
4384244192
python 可變對象和不可變對象

可以看到,我們並沒有修改內存中存儲的數據,而是引用了另外一個片內存,由於Python有小整數緩衝池,所以原來存儲10的內存片不會被垃圾回收

作為函數參數

>>> def myfunc(l):
... l.append(1)
... print(l)
...
>>> l = [1, 2, 3]
>>> myfunc(l)
[1, 2, 3, 1]
>>> l
[1, 2, 3, 1]

可變對象當函數參數傳入,並在函數內部進行修改時會修改全局變量的,因為在函數內部修改可變對象,就直接修改了內存中存儲的數據

>>> def myfunc(a):
... a += 1
... print(a)
...
>>> a = 2
>>> myfunc(a)
3
>>> a
2

不可變對象當函數參數傳入,在函數內部修改並不會修改內存中的數據,所以全局變量指向的內存還是原來的數據

可變對象當函數的默認參數是有問題的

>>> def myfunc(a=[]):
... a.append('test')
... print(a)
...
>>> myfunc()
['test']
>>> myfunc()
['test', 'test']
>>> myfunc()
['test', 'test', 'test']

由於函數在定義的時候,默認參數a的值就被計算出來了,它指向[]對應的內存地址,我們修改了a,也就是修改了[]對應內存地址當中的數據,當後面再次調用函數時,[]對應內存當中的數據已經變了。

解決辦法:

>>> def myfunc(a=None):
... if a is None:
... a = []
... a.append('test')
... print(a)
...
>>> myfunc()
['test']
>>> myfunc()
['test']


分享到:


相關文章: