當前位置:
首頁 > 最新 > Python面試之可變對象和不可變對象

Python面試之可變對象和不可變對象

上一篇Python面試之 is 和 == 的區別的最後留了一個問題:

Python里和None比較時,為什麼是 is None 而不是 == None 呢?

這是因為None在Python里是個單例對象,一個變數如果是None,它一定和None指向同一個內存地址。而 == None背後調用的是__eq__,而__eq__可以被重載,下面是一個 is not None但 == None的例子

好了,解答就到這裡,我們開始本篇的正題。

Python中有可變對象和不可變對象之分。可變對象創建後可改變但地址不會改變,即變數指向的還是原來的變數;不可變對象創建之後便不能改變,如果改變則會指向一個新的對象。

Python中dict、list是可變對象,str、int、tuple、float是不可變對象。

來看一個字元串的例子

上面的例子里,修改a指向的對象的值會導致拋出異常。

執行 a = a + " world"時,先計算等號右邊的表達式,生成一個新的對象賦值到變數a,因此a指向的對象發生了改變,id(a) 的值也與原先不同。

再來看一個列表的例子

上面對a修改元素、添加元素,變數a還是指向原來的對象。

將a賦值給b後,變數b和a都指向同一個對象,因此修改b的元素值也會影響a。

變數c是對b的切片操作的返回值,切片操作相當於淺拷貝,會生成一個新的對象,因此c指向的對象不再是b所指向的對象,對c的操作不會改變b的值。

理解了上面不可變對象和可變對象的區別後,我們再來看一個有趣的問題

明明group1和group2是不同的對象(id值不同),為什麼調用group2的add_member方法會影響group1的members?

所以,group1.members和group2.members指向了同一個對象,對group2.members的修改也會影響group1.members。

好了,問題來了,怎樣改代碼才能解決上面默認參數的問題呢?

答案下期揭曉,歡迎關注~


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

微軟更新量子開發套件支持macOS與Linux 增加與Python互通性
Python最值得收藏的10個開源項目

TAG:Python |