2013-12-04 3 views
2

Является ли аргумент по умолчанию одним и тем же объектом для всех экземпляров?python constructor default аргумент список

class X(): 
     def __init__(self,a=[]): 
     self.member=a 
     print id(a) 

    k=X([1,2,3]) 
    g=X([1,2,3]) 
    t=X() 
    h=X() 

Выход меня удивляет:

140072782781832 
    140072782901976 
    140072782816536 
    140072782816536 

Как вы можете видеть, идентификатор отличается, когда равен [1,2,3], но остается таким же, когда пусто. Однако, если я удалю self.member, теперь код выглядит следующим образом:

class X(): 
     def __init__(self,a=[]): 
     print id(a) 

    k=X([1,2,3]) 
    g=X([1,2,3]) 
    t=X() 
    h=X() 

Выход становится так:

140033294171528 
    140033294171528 
    140033294206232 
    140033294206232 

Ид остаются теми же, когда равен [1,2,3 ].

Я полностью смущен ... Кто-нибудь может это объяснить?

+0

Только первая половина вопроса является дубликатом этого. Вторая половина - новая. –

ответ

1

Да, и именно поэтому вы должны сделать

class X(): 
    def __init__(self, a=None): 
     self.a = [] if a is None else a 

Edit:

Я хотел бы отметить, что

class X(): 
    def __init__(self,a=[]): 
     print(id(a)) 

k = X([1,2,3]) 
g = X([1,2,4]) # <- different list values 
t = X() 
h = X() 

также дает

42678232 
42678232 
42680152 
42680152 

, поэтому я ожидаю, что ответ будет похож на «если вы создадите список, удалите его и создадите другой список, вероятность того, что он будет повторно использовать то же выделенное место памяти».

+0

Я думаю, что 'self.a = a или []' будет делать то же самое, эффективно, но быть более кратким. (Предполагая, что список ожидается, а не еще что-то вроде числа, которое, как представляется, здесь). –

+0

@WaleedKhan: использование 'a или []' имеет эффект использования * другого * списка из 'a '' '' 'является пустым списком. Если вызывающий абонент хотел, чтобы 'a' был * конкретным * пустым списком, тогда результат может быть неожиданным. –

+0

Можете ли вы объяснить вторую половину вопроса? Почему удаление 'self.member = a' меняет значение' id (a) '? –

Смежные вопросы