可變和不可變作為引數

開發人員需要考慮可變性時的一個主要用例是將引數傳遞給函式。這非常重要,因為這將決定函式修改不屬於其範圍的物件的能力,或者換句話說,如果函式具有副作用。這對於瞭解必須提供函式結果的位置也很重要。

>>> 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 作為函式的引數可以在本地修改。相反,lina 引用相同的物件。由於此物件是可變的,因此修改是就地完成的,這意味著 lina 引用的物件都被修改。lin 並不需要返回,因為我們已經以 a 的形式引用了這個物件。ab 結束引用相同的物件。

這對於元組來說並不相同。

>>> 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)

在函式的開頭,tina 引用相同的物件。但這是一個不可改變的物件。因此,當函式嘗試修改它時,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?如果使用相同的引數再次呼叫該函式會發生什麼?