python函式預設值的陷阱

2021-09-29 22:36:50 字數 1157 閱讀 7102

首先來看這樣一段**

def

add_list

(ori_list=

, element=

none):

return ori_list

list_1 = add_list(element=

'hehe'

)print

( list_1)

list_2 = add_list(element=

'haha'

)print

(list_2)

接果顯示

[

'hehe'][

'hehe','haha'

]

這時,我們會發現輸出結果和我們想的不一樣

為什麼會這樣呢。

我們都知道深淺拷貝,我個人認為這個問題深淺拷貝的底層原因差不多。

我們來看下面一段**

>>

>num = 1

>>

>id(num)

140721794998928

>>

>num += 1

>>

>num

2>>

>id(num)

140721794998960

>>

>id(1)

140721794998928

>>

>id(2)

140721794998960

對於傳統語言,上面這段**的執行方式將會是,先在記憶體中申明乙個num的變數,然後將1存入變數p所在記憶體。執行加法操作的時候得到2的結果,將2這個數值再次存入到num所在記憶體位址中。可見整個執行過程中,變化的是變num所在記憶體位址上的值

但是,從上面這段**中,python實際上是現在執行記憶體中建立了乙個1的物件,並將num指向了它。在執行加法操作的時候,實際上通過加法操作得到了乙個2的新物件,並將num指向這個新的物件。可見整個執行過程中,變化的是num指向的記憶體

這也體現了python中萬物皆物件的思想,我們實際建立的是乙個int物件,我們的num指向這個int物件

以上簡單來說呢,可以理解成,python函式的引數預設值,是在編譯階段就繫結的。

我們在程式設計時盡量避免這個bug就好

方法引數 預設值 引數的預設值陷阱!

今日分享 引數的預設值陷阱 下面定義的函式f,其引數d是乙個預設引數,且為字典型別 def f a,d print f a print f d do some process return d 最後返回字典d,下面呼叫函式f ret dict f 1 第二個引數d使用預設值 ret dict b 2...

lua 函式 預設值 定義函式引數的預設值

如果你想要命名引數和預設值,如php或python,你可以使用表構造函式呼叫你的函式 myfunction 函式本身可以有這樣的簽名 function myfunction t setmetatable t,local a,c t 1 or t.a,t 2 or t.b,t 3 or t.c fun...

函式(引數,預設值)

js定義函式引數沒有非常嚴格的要求,可以有也可以沒有,在呼叫的時候也是,引數可以有可以沒有,也可以和定義時的引數個數不一致 沒有給count傳入引數,預設為10 也可以直接在引數中給count賦值 但是特別注意的是不能給count傳入0,因為0與undefined都是false,因此count傳入的...