import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message))最近我在一段Python代碼中發(fā)現(xiàn)了一個因?yàn)殄e誤的使用默認(rèn)參數(shù)而產(chǎn)生的非常惡心的bug。如果您已經(jīng)知道關(guān)于默認(rèn)參數(shù)的全部內(nèi)容了,只是想嘲笑一下我這可笑的錯誤,請直接跳到本文末尾。哎,這段代碼是我寫的,但是我非常確定那天我被惡魔附體了。你懂的,有時候就是這樣。
本文僅僅是總結(jié)一下關(guān)于Python函數(shù)的標(biāo)準(zhǔn)參數(shù)和默認(rèn)參數(shù)的一些基本內(nèi)容。提醒你注意你的代碼中可能存在的陷阱。如果你剛開始接觸Python,開始寫一些函數(shù),我真心推薦你看一下Python官方手冊中關(guān)于函數(shù)的內(nèi)容,鏈接如下:Defining Functions 以及 More on Defining Functions。
簡單復(fù)習(xí)一下函數(shù)
Python是一個強(qiáng)大的面向?qū)ο笳Z言,它把這種編程范式推向了頂峰。但是,面向?qū)ο缶幊倘匀恍枰揽亢瘮?shù)這一概念,你可以用它來處理數(shù)據(jù)。Python對于可調(diào)用對象有一個更寬泛的概念,即任何對象都可以被調(diào)用,調(diào)用的意思是對其應(yīng)用數(shù)據(jù)。
函數(shù)在Python中是可調(diào)用對象,并且乍一看,它和其他語言中的函數(shù)有著類似的行為。它們獲取一些數(shù)據(jù),這些數(shù)據(jù)被稱為參數(shù),然后處理它們,接著返回結(jié)果(如果沒有return語句則是None)
參數(shù)被聲明為占位符(在定義函數(shù)的時候),用以代表那些當(dāng)函數(shù)調(diào)用時被實(shí)際傳入的對象。在Python中你不需要聲明參數(shù)的類型(例如,像你在C或Java中做的那樣)因?yàn)镻ython哲學(xué)依賴于多態(tài)。
記住,Python的變量是引用,即實(shí)際變量的內(nèi)存地址。這意味著Python的函數(shù)永遠(yuǎn)以“傳址”的方式工作(這里使用了一個C/C++術(shù)語),當(dāng)你調(diào)用一個函數(shù)的時候,并不是復(fù)制了一份參數(shù)的值來替換占位符,而是把占位符指向了變量本身。這導(dǎo)致了一個非常重要的結(jié)果:你可以在函數(shù)內(nèi)部改變這個變量的值。這里有一個很好可視化講解,關(guān)于引用機(jī)制。
引用在Python扮演著非常重要的角色,它是Python完全多態(tài)方式的骨干。關(guān)于這個非常重要的主題,請點(diǎn)擊這個鏈接 查看更好的解釋。
為了檢查你是否理解了這門語言的這一基本特性,請跟隨這段簡單的代碼(變量ph代表的是“占位符(placeholder)”)
>>> def print_id(ph):... print(hex(id(ph)))...>>> a = 5>>> print(hex(id(a)))0x84ab460>>> print_id(a)0x84ab460>>>>>> def alter_value(ph):... ph = ph + 1... return ph...>>> b = alter_value(a)>>> b6>>> a5>>> hex(id(a))'0x84ab460'>>> hex(id(b))'0x84ab470'>>>>>> def alter_value(ph):... ph.append(1)... return ph...>>> a = [1,2,3]>>> b = alter_value(a)>>> a[1, 2, 3, 1]>>> b[1, 2, 3, 1]>>> hex(id(a))'0xb701f72c'>>> hex(id(b))'0xb701f72c'>>>
新聞熱點(diǎn)
疑難解答
圖片精選