Инициализация ключевых аргументов в Python - PullRequest
0 голосов
/ 05 мая 2009

Почему следующее:

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

a1 = A()
a1._var.append('one')

a2 = A()

результат:

var = [] 182897439952
var = ['one'] 182897439952

Я не понимаю, почему он не использует новый экземпляр списка при использовании необязательных аргументов ключевого слова, кто-нибудь может объяснить это?

Ответы [ 3 ]

6 голосов
/ 05 мая 2009

Пустой список в определении вашей функции создается один раз, во время создания самой функции. Он создается не каждый раз, когда вызывается функция.

Если вы хотите новый каждый раз, сделайте это:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
2 голосов
/ 05 мая 2009

Это просто неправильно. Вы не можете (осмысленно) предоставить изменяемый объект в качестве значения по умолчанию в объявлении функции.

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

Вы должны сделать что-то подобное.

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))
1 голос
/ 05 мая 2009

Пустой список в определении вашей функции создается один раз, во время создания самой функции. Он создается не каждый раз, когда вызывается функция.

Точно. Чтобы обойти это, присвойте None в определении функции и проверьте None в теле функции:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
...