經(jīng)驗:一定要仔細看講義癞志,講的很清楚充活。要多次看看啊亿眠。
def addList(L=['a']):
L.append('END')
return L
以上調(diào)用多次,會出現(xiàn)多個ENDV巍7啤!
以下所有的調(diào)用唆铐,都正常顯示U芷荨!
def sst(s="aa"):
s=s + "b"
return s
def ssr(s=""):
s=s + "b"
return s
def num_test(s=1):
s=s+1
return s
def saar(s=''):
s=s + 'b'
return s
總結(jié):
Python函數(shù)在定義的時候艾岂,默認參數(shù)L的值就被計算出來了顺少,即[],因為默認參數(shù)L也是一個變量王浴,它指向?qū)ο骩]脆炎,每次調(diào)用該函數(shù),如果改變了L的內(nèi)容氓辣,則下次調(diào)用時秒裕,默認參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時的[]了钞啸。
這個函數(shù)defadd_end(L=[]):
L.append('END')
return L
在定義的時候几蜻,L的值被指向了對象[],
我們第一次調(diào)用函數(shù)的時候,>>>add_end()
['END']
因為沒有給參數(shù)体斩,默認L=[]
就是L的值被指向了對象[]梭稚,(可以理解為賦值)
定義函數(shù)的時候,括號里的不是變量類型絮吵,是定義了類型弧烤,并賦值了。
而且這賦值只有在第一次引用的時候有用蹬敲。因為這是可變對象暇昂。如果是不變對象,那么第二次引用的時候伴嗡,繼續(xù)賦值急波。
上面這句話盡量不要這樣理解。請按照下面理解:
def函數(shù)的時候闹究,L已經(jīng)被分配了內(nèi)存空間幔崖,這才是需要重視的地方食店。即使你調(diào)用再多次渣淤,L就是指向一個內(nèi)存空間赏寇。
而String和int不一樣,是不變對象价认,def函數(shù)的時候嗅定,指向了一個空間。一旦再次調(diào)用用踩,馬上指向了新的空間渠退,如下圖。
總結(jié)就是:函數(shù)定義默認參數(shù)要牢記一點:默認參數(shù)必須指向不變對象脐彩!
不可變(immutable):int碎乃、字符串(string)、float惠奸、(數(shù)值型number)梅誓、元組(tuple)
可變(mutable):字典型(dicti)、列表型(list)
函數(shù)定義默認值绵载,首先指出了變量類型埂陆,其次指出了默認參數(shù)。再理解到函數(shù)定義的一開始尘分。默認參數(shù)L對象建立猜惋。最后理解不可變對象和可變對象。把那幾個程序都敲敲培愁,就可以了著摔。
關于測試的時候一些小錯誤
num和num()的區(qū)別,一個是函數(shù)調(diào)用定续,一個是函數(shù)名
如果直接打函數(shù)名谍咆,就會出現(xiàn)下面的內(nèi)容,這是因為返回的是函數(shù)num所在的內(nèi)存地址