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