python是個人最喜歡的語言,剛開始接觸python時,總覺得有很多槽點,不太喜歡。後來,不知不覺中,就用的多了、習慣了、喜歡上了。python的功能真的很強大,自己當初學習這門語言的時候,也記錄過很多的筆記,現慢慢把這些筆記發布出來,希望對大家有所幫助,對自己也算是乙個總結。
關於python預設引數,假如預設引數是可變物件是會有***的,這一點我一開始不是很理解,直到有一天,看到一篇博文說:乙個函式引數的預設值,僅僅在該函式定義的時候,被賦值一次。如此,只有當函式第一次被定義的時候,才講引數的預設值初始化到它的預設值(如乙個空的列表)。
聽到這個解釋,豁然開朗,直譯器試驗如下:
1 >>> def f(x =):2print
(id(x))
4printx5
(id(x))67
8 >>>f()
9 38869952 #
可變預設引數是在原地更改!!!
10 38869952
11 >>>f()
12 38869952 #
再次呼叫時,可變預設引數還是引用最初定義的!!!
13 3886995214#
注意,預設引數是在定義時賦值,且僅僅賦值一次。15#
當函式多次被呼叫,並且沒有提供預設的引數值,就會從定義時賦值的地方取得值!16#
即使函式中給預設引數重新賦值了,下次呼叫還是會從定義賦值的地方取得值!17#
如以下的示例:當f2()多次呼叫,雖然在函式體裡面給y重新賦值了,但是下次呼叫時18#
再次列印print id(x) 的結果也還是一樣的!19#
所以:20
#1. 假如預設引數是可變物件,則會在原處直接更改物件,下次呼叫引數時,預設引數已經21#
更改過的了。如f()函式。22#
2. 假如預設引數不可變,那麼給函式中給 引數賦值時,引數會引用記憶體的其他地方。下次函式呼叫時23#
預設引數還是從定義時賦值處取得值,因此沒有***!
24 >>> def f2(y =none):
25print
(id(y))
26if
noty:
27 y =
29print
(id(y))
3031
32 >>>f2()
33 505672708 #
定義時預設引數引用這一塊記憶體。
34 38888872 #
函式體內賦值後,y引用其他地方。
35 >>>f2()
36 505672708 #
再次呼叫,y還是引用定義時賦值的記憶體處。
37 43910728 #
函式體內賦值後,y引用其他地方。
38 >>>f()
39 38869952
40 38869952
41 >>>f2()
42 505672708
43 43909408
44 >>>f2()
45 505672708
46 38868752
47 >>>
python 預設引數 Python預設引數有坑?
最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...
python預設引數
預設引數很有用,但使用不當,也會掉坑里。預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個list,新增乙個end再返回 def add end l return l當你正常呼叫時,結果似乎不錯 add end 1,2,3 1,2,3,end add end x y z x y z end 當...
Python預設引數
def add end list return list 預設引數多次呼叫,竟然每次結果不一樣 n 0 while n 5 print n,add end n 1 列印結果 很多初學者很疑惑,預設引數是 但是函式似乎每次都 記住了 上次新增了 end 後的list。原因解釋如下 python函式在定...