Как использовать [] в качестве значения по умолчанию для аргумента именованной функции в python?

Возможный дубликат:
"Наименьшее удивление" в Python: изменчивый аргумент по умолчанию

У меня есть этот код

class Test(object):
  def __init__(self, var1=[]):
    self._var1 = var1

t1 = Test()
t2 = Test()

t1._var1.append([1])

print t2._var1

и я получаю "[[1]]" в результате. Очевидно, что t1._var1 и t2._var1 обращаются к одному и тому же списку. Если я поставлю

t3 = Test()
print t3._var1

тогда я получаю "[[1]]" также. Таким образом, var1 = [], кажется, навсегда связывает var1 с некоторым списком. Я пытался скопировать список,

def __init__(self, var1=copy([])):

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

Так как же использовать [] в качестве значения по умолчанию для именованного аргумента?

1 ответ

Решение

Вы не можете использовать [] напрямую, если вы хотите, чтобы каждый объект имел пустой список. Я склонен использовать обходной путь:

def __init__(self, var1=None):
    if var1 is None:
        var1 = []
    ....

Естественно, это не сработает, если var1 может быть None, вам нужно будет использовать другой объект.

Другие вопросы по тегам