1樓:pansz
其實這取決於:為什麼要提出這個問題。
之所以需要區分可變物件還是不可變物件,是因為在某些特定地方只能使用不可變物件,所以Python需要有對不可變物件的定義,從而滿足這個定義的都可以用於某些特定場合。
如果脫離這些實際的使用場合,那麼糾結可變物件以及不可變物件的定義就變得毫無意義。
因此,我們能否改變python函式的值,這一點不重要,重要的是它能被放到哪。常規來說它能作為dict的key,也能作為set的element,這些常規的不可變物件適用場合都能夠用函式,那麼可以見得,它能夠被使用的場合與多數不可變物件一致,所以它可以被歸類為不可變物件。理解到這個程度一般也就夠了。
2樓:zpan
可變的,因為函式可以是乙個閉包,且閉包的內部變數可以被修改。
3樓:靈劍
這個回答很反直覺,歸根結底是因為Python是這麼定義的:絕大部分物件是不可變物件,少部分物件是可變物件。
按照Python的定義,是否可變考慮的是物件的值(value)而非屬性。具體來說,一般通過__eq__和__hash__的性質來判斷,如果正確實現了__hash__,即:
hash值在某個物件的生命週期中保持不變
物件相等則hash值相等
則為不可變物件。
而自定義物件是有預設的__hash__實現的,因此自定義物件如果不覆蓋__eq__就已經是不可變物件了,只有覆蓋__eq__但未覆蓋__hash__的情況下才是可變物件。系統庫當中可變物件的例子主要是list、dict和set,其它還包括bytearray之類。
實際上要區分這兩者只要記住,能做dict的key的就是不可變物件,不能的大部分是可變物件(反例是包含list的tuple,按照官方文件定義,仍然認為tuple是不可變的)
回到最初的問題,函式雖然可以設定屬性,但函式物件是有固定的__hash__實現的,因而函式物件不可變。
4樓:775CPU
可變物件
你可以誰便給乙個函式物件修改屬性:foo.a=233deffoo
():return
"Hello"
deffoo2
():return
"Hello 2"
print(id
(foo
),foo
())foo
.__code__
=foo2
.__code__
print(id
(foo
),foo
())你甚至可以通過修改 __code__ 屬性動態改變函式行為事實上,Python 中的大多數東西都是可變的。所以真正的問題是,為什麼函式的 __closure__和__globals__ 不可變?
Python中id函式為什麼會對不同物件返回相同值?
冒泡 關於1,請參考py的語法,你在a中用a.b和A.b都可以呼叫到b,這裡a.b實際上會像你說的,向上查詢到A.b,但你直接寫b不行 關於2,反對現在所有答案中關於 引用同乙個方法物件 的說法 class Adef f selfpass.a1 A a2 A id a1.f id a2.f True...
如何理解「python中函式是一等公民」?
vincen 在Python中,函式是一等物件。程式語言理論家把 一等物件 定義為滿足下述條件的程式實體 1 在執行時建立 2 等賦值給變數或者資料結構中的元素 3 能作為引數傳給函式 4 能作為函式的返回結果 Xi Yang 函式能作為引數和函式式程式設計可完全是兩碼事。真的函式式程式設計是這樣的...
前端使用物件導向式程式設計 還是 函式式程式設計 針對什麼問題用什麼方式 分別有什麼具體案例?
程式碼咚咚鏘 物件導向程式設計 將資料進行封裝,每次修改封裝的物件屬性,都影響到了全域性 函式式程式設計 乙個輸入屬於對應乙個輸出,函式內的資料修改只作用到區域性內。 貘吃饃香 瀉藥為啥又得攙和這些破爛事兒 阮大師貼的東西我認為就是個玩笑 雖然有人認為他是認真的 拿純函式式來說 幾個重要特點 1 不...