2009-05-05 9 views
0

Почему следующее:Инициализация ключевых слов аргументах в Python

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

было объяснено снова и снова. – SilentGhost

+1

Пример объяснения: http://stackoverflow.com/questions/530530/python-2-x-gotchas-and-landmines –

+1

или здесь: http://stackoverflow.com/questions/366422/what-is-the- pythonic-way-to-avoid-default-parameters-that-are-empty-lists – SilentGhost

ответ

6

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

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

class A(object): 
    def __init__(self, var=None): 
     if var is None: 
      var = [] 
     self._var = var 
+0

Более чистый способ записи (непроверенный): self._var = var или [] – wbyoung

+2

Это не делает то же самое , Например, «1 или []» равно 1, но «0 или []» - [] – RichieHindle

2

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

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

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

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

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