可变和不可变作为参数
开发人员需要考虑可变性时的一个主要用例是将参数传递给函数。这非常重要,因为这将决定函数修改不属于其范围的对象的能力,或者换句话说,如果函数具有副作用。这对于了解必须提供函数结果的位置也很重要。
>>> 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?如果使用相同的参数再次调用该函数会发生什么?