可變資料型別不能作為python函式的引數

2022-06-10 12:24:08 字數 2830 閱讀 7428

可變資料型別:列表、字典

不可變資料型別:整型、浮點型、字串、元組

為什麼可變資料型別不能作為python函式的引數?請看以下例子:

def foo(a=):

return

aprint

(foo())

print

(foo())

print(foo())

結果:

[1]

[1, 1]

[1, 1, 1]

print

(id(foo()))

print

(id(foo()))

print(id(foo()))

結果:

140344852133960

140344852133960

140344852133960

會發現我們每次返回的都是同乙個物件。

再看下以下例子:

b = [1,2]

def test(place=b):

return

place

print

(b)print

(test())

print

(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

print

(id(c))

print(id(d))

結果:

140344851860104

140344851860104

當我們修改d的值時,同樣也會影響到c:

print

(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())

print

(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 不可變資料型別 資料型別是不允許改變的,這就意味著如果改變量字資料型別的值,將重新分配記憶體空間...