не понимаю замыкания вопроса в питоне - PullRequest
5 голосов
/ 05 декабря 2010
def a(b=[]):
    b.append(1)
    return b

print a()
print a()

Внезапно я получил список из 2 элементов, но как? Не следует каждый раз получать пустой список.

Спасибо за помощь

Ответы [ 4 ]

10 голосов
/ 05 декабря 2010

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

9 голосов
/ 05 декабря 2010

Ничего общего с замыканиями, по крайней мере, не в обычном смысле.

Значение по умолчанию для b не является "новым пустым списком";это «этот конкретный объект, который я только что создал прямо сейчас, определяя функцию, инициализируя ее как пустой список».Каждый раз, когда функция вызывается без аргумента, используется один и тот же объект.

3 голосов
/ 05 декабря 2010

Исправленная версия, по причинам, указанным в других ответах:

def a(b=None):
    b = [] if b is None else b

    b.append(1)
    return b
1 голос
/ 05 декабря 2010

аргументы по умолчанию оцениваются (один раз), когда функция определена, а не каждый раз, когда она вызывается.

попробуйте это:

def a(b=None):
    if b is None
        b = []     
    b.append(1)
    return b

print a()
print a()
...