可變和不可變作為引數
開發人員需要考慮可變性時的一個主要用例是將引數傳遞給函式。這非常重要,因為這將決定函式修改不屬於其範圍的物件的能力,或者換句話說,如果函式具有副作用。這對於瞭解必須提供函式結果的位置也很重要。
>>> def list_add3(lin):
lin += [3]
return lin
>>> a = [1, 2, 3]
>>> b = list_add3(a)
>>> b
[1, 2, 3, 3]
>>> a
[1, 2, 3, 3]
在這裡,錯誤是認為 lin
作為函式的引數可以在本地修改。相反,lin
和 a
引用相同的物件。由於此物件是可變的,因此修改是就地完成的,這意味著 lin
和 a
引用的物件都被修改。lin
並不需要返回,因為我們已經以 a
的形式引用了這個物件。a
和 b
結束引用相同的物件。
這對於元組來說並不相同。
>>> def tuple_add3(tin):
tin += (3,)
return tin
>>> a = (1, 2, 3)
>>> b = tuple_add3(a)
>>> b
(1, 2, 3, 3)
>>> a
(1, 2, 3)
在函式的開頭,tin
和 a
引用相同的物件。但這是一個不可改變的物件。因此,當函式嘗試修改它時,tin
會接收帶有修改的新物件,而 a
會保留對原始物件的引用。在這種情況下,返回 tin
是強制性的,否則新物件將丟失。
行使
>>> def yoda(prologue, sentence):
sentence.reverse()
prologue += " ".join(sentence)
return prologue
>>> focused = ["You must", "stay focused"]
>>> saying = "Yoda said: "
>>> yoda_sentence = yoda(saying, focused)
注意:reverse
就地執行。
你覺得這個功能怎麼樣?它有副作用嗎?是必要的回報嗎?通話結束後,saying
的價值是多少? focused
?如果使用相同的引數再次呼叫該函式會發生什麼?