Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

В чем отличие двух функций?

#python


def foo1(x=[]):
    x.append(1)
    print(x)

def foo2():
    x  = []
    x.append(1)
    print(x)


Почему при неоднократном вызове функции foo1() (без аргументов) получается вывод:

[1]
[1, 1]
[1, 1, 1]
...

    


Ответы

Ответ 1



Разница в том, что первая функция может принимать 1 агрумент, вторая не принимает аргументов. Советую прочитать краткую информацию о функциях в Python. Поведение, о котором Вы спрашиваете, происходит по такой причине, что значение по-умолчанию (пустой список) вычисляется единожды, когда функция была скомпилирована, затем оно используется при каждом вызове функции. Чтобы избежать такого поведения и получать пустой список при каждом вызове, измените код следующим образом: def foo1(x=None): if x is None: x = [] x.append(1) print(x)

Ответ 2



Почему при неоднократном вызове функции foo1() (без аргументов) получается вывод Аргументы по умолчанию создаются однажды и живут пока жива сама функция. Не используйте изменяемые объекты (такие как списки, словари) в качестве аргументов по умолчанию. Если вы в foo1() ничего не передаёте, то у вас есть только один список x куда вы при каждом вызове добавляете новые элементы. foo2() при каждом вызове создаёт новый список и прибавляет к нему один элемент.

Ответ 3



Если в двух словах, то так: Аргумент по умолчанию будет тем же самым объектом, даже при разных вызовах функции. То есть, если вы изменяете этот объект в одном вызове функции, то он сохранит это новое значение при следующем вызове. Это никак не проявляется, когда в качестве умолчания вы используете неизменяемые объекты (числа, строки, кортежи и т.п.) Но это становится заметным, если в качестве умолчания вы используете изменяемые объекты (списки, множества и т.п.) Поэтому обычно крайне не рекомедуется использовать изменяемые объекты как аргумент по умолчанию.

Комментариев нет:

Отправить комментарий