2009-05-05 124 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 2009-05-05 13:48:53

+1

解釋的例子:http://stackoverflow.com/questions/530530/python-2-x-gotchas-and-landmines – 2009-05-05 13:54:11

回答

6

在創建函數本身時,函數定義中的空列表會創建一次。每次調用函數時都不會創建它。

如果你想要一個新的每一次,這樣做:

class A(object): 
    def __init__(self, var=None): 
     if var is None: 
      var = [] 
     self._var = var 
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

在函數定義的空列表創建一次,當時自己創建功能。每次調用函數時都不會創建它。

沒錯。要解決此分配問題無法定義函數定義並在函數體中檢查無:

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