Python, изменяемый объект в качестве аргумента по умолчанию, есть ли способ решить? - PullRequest
1 голос
/ 21 сентября 2011
class A:
    def __init__(self, n=[0]):
        self.data = n

a = A()
print a.data[0] #print 0
a.data[0] +=1

b = A()
print a.data[0] #print 1, desired output is 0

В случае выше, есть ли способ предоставить аргумент по умолчанию с изменяемым объектом (таким как список или класс) в __init __ () class A , но b не зависит от операции a ?

Ответы [ 3 ]

7 голосов
/ 21 сентября 2011

Вы можете попробовать это:

class A:
   def __init__(self, n=None):
       if n is None:
         n = [0]
       self.data = n

Это позволяет избежать самой большой проблемы, с которой вы здесь сталкиваетесь, то есть это один и тот же список для каждого объекта вашего типа "A".

4 голосов
/ 21 сентября 2011

Одна возможность:

class A:
    def __init__(self, n=None):
        if n is None:
            n = [0]
        self.data = n
0 голосов
/ 21 сентября 2011

Также:

class A:
    def __init__(self, n=[0]):
        print id(n)
        self.data = n[:]
        print id(self.data)
        del n


a = A()
print a.data[0] #prints 0
a.data[0] +=1
print a.data[0] #prints 1

print

b = A()
print b.data[0] #prints desired output  0

Принцип заключается в том, что он создает другой список.Если в качестве аргумента передается длинный список, в памяти будет два длинных списка.Таким образом, неудобство в том, что он создает другой список ... Вот почему я удаляю n .

Не думаю, что это лучше, но это может дать вам понимание того, что происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...