Inicializace klíčových args v Pythonu

hlasů
0

Proč takto:

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()

výsledek v:

var = [] 182897439952
var = ['one'] 182897439952

Nechápu, proč se nepoužívá novou instanci seznamu při použití volitelné argumenty klíčových slov, může někdo vysvětlit?

Položena 05/05/2009 v 14:47
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
6

Prázdný seznam v definici funkce je vytvořena jednou, v době, kdy je funkce sama o sobě je vytvořen. To není vytvořena pokaždé, když je funkce se nazývá.

Pokud chcete, aby nový pokaždé, to následujícím způsobem:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
Odpovězeno 05/05/2009 v 14:51
zdroj uživatelem

hlasů
2

To je prostě špatně. Nemůžete (smysluplně) poskytují proměnlivé objekt jako výchozí hodnoty v deklaraci funkce.

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

Musíte udělat něco takového.

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))
Odpovězeno 05/05/2009 v 14:52
zdroj uživatelem

hlasů
1

Prázdný seznam v definici funkce je vytvořena jednou, v době, kdy je funkce sama o sobě je vytvořen. To není vytvořena pokaždé, když je funkce se nazývá.

Přesně tak. Chcete-li vyřešit tento přiřadit Žádný int he funkce definiton a zkontrolujte, zda nevznikla v těle funkce:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
Odpovězeno 05/05/2009 v 14:55
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more