<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
經常會看到這樣一句程式碼警告:
Default argument value is mutable
意思是告訴我們函數的定義中,使用可變型別做預設引數。
那為什麼會有這個警告呢?
def fun(a=[]): a.append(1) print(a) if __name__ == "__main__": fun() fun() >>> [1] [1, 1]
可以發現,預設引數定義可變型別之後,在第二次乃至更多次地呼叫同一個函數時,預設引數彷彿失去了效果。
此時,在需要重複呼叫同一個函數的場景中,就非常容易導致問題,並且該問題不易察覺。在debug的時候就會表現成明明沒有引數傳進來,但是函數引數會有值,並且執行了不應該執行的操作。
我的理解:
我們定義的函數本身是一個function的範例化物件,每當我們進行函數的定義時,就是建立了一個function的範例化物件,而預設引數就是其屬性。
在沒有傳入引數,以預設引數形式呼叫,並且改變了函數物件的屬性值時,改變的屬性值被儲存下來,當第二次呼叫同一個物件時,屬性值已經發生了改變。
type(fun) >>> function
def fun(a=None): if a is None: a = [] a.append(1) print(a) if __name__ == "__main__": fun() fun() >>> [1] [1]
請先看程式碼,看看程式碼的輸出是否和你想的一樣。
def e(v,l=[]): l.append(v) return l l1=e(10) l2=e(123,[]) l3=e("a") print(l1,l2,l3) # 輸出: ([10, 'a'], [123], [10, 'a'])
關於上述程式碼,標準解釋是:帶有預設引數的表示式在函數被定義的時候被計算,不是在呼叫的時候計算。
我覺得通俗的解釋是:當不傳預設值的時候,無論呼叫多少次該函數,在函數體內部使用的一直都是那個預設的“l”,而這個預設的“l”又是可變型別,所以,它的改變會影響所有指向它的變數,也就是l1和l3。
為了使以上兩點的觀點更加站的住腳,我進行以下幾個測試。
def e(k,v,d={}): d[k]=v return d d1=e(10,10) d2=e(123,123,{}) d3=e("a","a") print(d1,d2,d3) # 輸出:({'a': 'a', 10: 10}, {123: 123}, {'a': 'a', 10: 10})
def e(v,s=""): s = s+v return s s1=e("我") s2=e("a","") s3=e("是") print(s1,s2,s3) # 輸出: 我 a 是
其實以上型別都已經說明問題了,但是寫個文章不容易,我決定用元祖包列表,看看修改這個列表中的資料會怎樣。
實際上是不用測試的,最終列印出來的資料一定是類似**“可變型別時的操作”**時的輸出的。
為什麼?因為我沒有修改元祖本身,修改的是其可變型別列表啊。
不能扯遠了,不然扯到深拷貝,淺拷貝了。
def e(v,t=([],)): # 傳遞有元素的元祖的時候要記得帶逗號哦。 t[0].append(v) # t = t[0].append(v) 要知道t[0].append(v)是沒有返回值的,t會指向None,如果這樣返回,外部列印的全部為None,所以不可以這樣返回。 # 而且 如果你想 t[0]= t[0].append(v) 也是不行的,為啥?你在ipython中輸入 dir(())你就知道了。 # 好吧,其實是因為元祖是可讀不可寫的。它能切片、遍歷就已經很不錯了。。。。。 return t t1=e("我") t2=e("a",([],)) t3=e("是") print(t1,"n",t2,"n",t3) # 輸出: # (['我', '是'],) # (['a'],) # (['我', '是'],)
家裡停電了,所以我來到了網咖,這篇文章是在網咖寫的,用的是python3的線上編輯器,有的地方編碼(比如命名-。-)或者表述的不好請多多見諒。
關於集合,我就不做測試了,集合一般用於去重和關係運算,它是無序,不重複,可變型別。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45