2012-05-17 24 views
3

我有一個關於Python中的類init函數的查詢。我在試圖創建一個文本冒險遊戲類型的環境,每個房間都有一個「物品」屬性,存儲爲一個列表。我試過如下:Python __init__函數的變量標識 - 任何人都可以解釋嗎?

教室:

def __init__(self,items=[]): 
    self.items=items 

但是我發現這是每一個沒有上開始定義的項目房間不僅得到一個空列表,但相同空的清單。現在,如果我創建了一堆房間並將其中的一個項目添加到其中一個項目中,則該項目會出現在每個房間中。

很容易修復(手動分配一個空的列表到每個房間),但我不明白爲什麼會發生這種情況。我會想象創建空間a會創建一個空的列表a.items,而b房間會創建b.items。但任何人都可以解釋爲什麼這些會是相同的?有沒有一種方法來產生上述函數的默認值,每次創建一個不同的列表?

乾杯,

比利。

回答

3

你必須瞭解Python中的默認參數。 當你編寫items = []時,你創建一個全局變量[],當你沒有提供一個合適的參數時,你賦值給item。 這意味着每次項目採用默認值時,它將被分配相同的[]對象。 (請記住,和Java一樣,變量只是對象的引用,所有的變量都是對同一個對象的引用)。

正式解釋: http://effbot.org/zone/default-values.htm

你可以做的是:

def __init__(self, items=None): 
    if items is None: 
     items = [] 
    self.items = items 

這種方式,默認值,無,是從來沒有改變過。當發現時,會創建一個新列表(這次是一個真正的新列表,而不是全球列表)。

相關問題