可变和不可变作为参数

开发人员需要考虑可变性时的一个主要用例是将参数传递给函数。这非常重要,因为这将决定函数修改不属于其范围的对象的能力,或者换句话说,如果函数具有副作用。这对于了解必须提供函数结果的位置也很重要。

>>> 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?如果使用相同的参数再次调用该函数会发生什么?