Как использовать [] в качестве значения по умолчанию для именованного аргумента функции в 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
, вам нужно будет использовать другой объект.