python函式是可變物件還是不可變物件

時間 2022-01-18 06:18:33

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 不...