可變資料型別:列表、字典
不可變資料型別:整型、浮點型、字串、元組
為什麼可變資料型別不能作為python函式的引數?請看以下例子:
def foo(a=):return
aprint
(foo())
(foo())
print(foo())
結果:
[1][1, 1]
[1, 1, 1]
(id(foo()))
(id(foo()))
print(id(foo()))
結果:
140344852133960140344852133960
140344852133960
會發現我們每次返回的都是同乙個物件。
再看下以下例子:
b = [1,2]def test(place=b):
return
place
(b)print
(test())
(b)print
(test())
print(b)
結果:
[1, 2][1, 2, 1]
[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1]
c = [1,2,3]d =c
(id(c))
print(id(d))
結果:
140344851860104140344851860104
當我們修改d的值時,同樣也會影響到c:
(d)print
(c)print
(id(d))
print(id(c))
結果:
[1, 2, 3, 4][1, 2, 3, 4]
140344851860104
140344851860104
所以在上述中,通過在test()函式中修改place的值也會影響到b的值。
為什麼會這樣呢?
python中一切皆物件。函式也是物件,可以這麼理解,乙個函式是乙個被它自己定義而執行的對,;預設引數是一種"成員資料",所以它們的狀態和其他物件一樣,會隨著每一次呼叫而改變。
怎麼避免這種現象呢?
使用以下方式:
def foo(a=none):if a is
none:
a =return
aprint
(foo())
(foo())
print(foo())
結果:
[1][1][1]
如果需要處理任意物件(包括none),則可以使用哨兵物件:
sentinel =object()def myfunc(value=sentinel):
if value is
sentinel:
value =expression
#use/modify value here
應用:求陣列的全排列
最後我們來看乙個應用例子:求陣列的全排列
基本思路是回溯法:每次從陣列中選乙個值加入到tmp中,如果陣列中沒有值了,就將tmp加入到結果中,返回。
如果我們的**是這種:
arr = [1,2,3]res =
def permutation(arr,tmp=):
global
res
if len(arr) ==0:
return
for i in
range(len(arr)):
tmp = tmp +[arr[i]]
newarr = arr[:i]+arr[i+1:]
permutation(newarr,tmp)
subset(arr,tmp=)
print(res)
結果:
[[1, 2, 3], [1, 2, 3, 2], [1, 2, 1, 3], [1, 2, 1, 3, 1], [1, 2, 3, 1, 2], [1, 2, 3, 1, 2, 1]]
這裡就出現了上述的情況,我們只需要簡單的改以下即可:
arr = [1,2,3]res =
def permutation(arr,tmp=):
global
res
if len(arr) ==0:
return
for i in
range(len(arr)):
newtmp = tmp +[arr[i]]
newarr = arr[:i]+arr[i+1:]
permutation(newarr,newtmp)
subset(arr,tmp=)
print(res)
結果:
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
我們只需要每次新建乙個列表即可。
參考:
python 可變資料型別 不可變資料型別
在python中,資料型別分為可變資料型別和不可變資料型別,不可變資料型別包括string,int,float,tuple,可變資料型別包括list,dict。所謂的可變與不可變,舉例如下 a test print a 0 t a 0 1 traceback most recent call las...
python 可變資料型別 不可變資料型別
在python中,資料型別分為可變資料型別和不可變資料型別,不可變資料型別包括string,int,float,tuple,可變資料型別包括list,dict。所謂的可變與不可變,舉例如下 a test print a 0 t a 0 1 traceback most recent call las...
可變資料型別與不可變資料型別
可變資料型別 資料更改前後,記憶體id不變 列表,字典,集合 不可變資料型別 資料更改前後,記憶體id發生改變 數字 包括 整型,浮點型 字串,元組 分別對各種資料型別進行驗證 數字 int float 不可變資料型別 資料型別是不允許改變的,這就意味著如果改變量字資料型別的值,將重新分配記憶體空間...