0 Изменчивый и неизменный как аргументы

Одним из основных вариантов использования, когда разработчику необходимо учитывать изменчивость, является передача аргументов функции. Это очень важно, потому что это будет определять способность функции изменять объекты, которые не принадлежат ее области действия, или, другими словами, если функция имеет побочные эффекты. Это также важно для понимания того, где должен быть доступен результат функции.

 >>> 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 и 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 ? Что происходит, если функция вызывается снова с теми же параметрами?