Вопрос

Почему происходит следующее:

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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top