Инициализация аргументов ключевого слова в Python
-
05-07-2019 - |
Вопрос
Почему происходит следующее:
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
Я не понимаю, почему он не использует новый экземпляр списка при использовании необязательных аргументов ключевого слова, может ли кто-нибудь это объяснить?
Решение
Пустой список в определении вашей функции создается один раз, во время создания самой функции. Он создается не каждый раз, когда вызывается функция.
Если вы хотите новый каждый раз, сделайте это:
class A(object):
def __init__(self, var=None):
if var is None:
var = []
self._var = var
Другие советы
Это просто неправильно. Вы не можете (осмысленно) предоставить изменяемый объект в качестве значения по умолчанию в объявлении функции.
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))
Пустой список в определении вашей функции создается один раз, во время создания самой функции.Он не создается каждый раз при вызове функции.
Точно.Чтобы обойти эту проблему, назначьте 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))