2013-10-12 98 views
3

下面是from file import * 情況分配之前引用的類內局部變量

class Person(object): 
    NumRid = 1 
    def __init__(self, name, rid = NumRid): 
     self.name = name 
     self.rid = rid 
     NumRid += 1 

class Investor(Person): 
    pass 

然後我進入交互式Python會話,和類型,然後 投資者(「鮑勃」) 和它告訴我,局部變量NumRid在賦值之前被引用,位於NumRid += 1

據我可以從谷歌搜索可以看出,NumRid應該在類的本地命名空間,並可以從類函數訪問....所以這是怎麼回事?我是否需要宣佈它們都是全球性的;或者是否有一個我能夠鍵入的魔術詞,使它在類命名空間中查找NumRid(如果有的話)?

+1

'UnboundLocal'問題在這裏每週要問兩次,使用搜索和按分數排序應該引導您進行一些詳細解釋(簡而言之:您不能分配給周圍範圍定義的變量,至少不能喜歡這個)。另一件事,但; 'rid = NumRid'不會做你想做的事情,因爲默認參數是在編譯時計算的,因此'rid'總是爲0.只需直接引用類變量並刪除冗餘參數... – l4mpi

+0

那麼,每次創建一個新的投資者時,我都想增加投入,並將其作爲默認值,同時也可以選擇傳遞不同的值:我檢查了行爲,並且似乎將它們全部初始化爲1,這與我理解它,就是你的意思0 – Zach

+1

是的,你說的是正確的,我的評論中的'0'應該是'1'。如果您希望能夠傳入不同的值,請將標記值用作默認值 - 通常您會選擇「無」,除非此值可以是有效值。然後在方法內部測試參數是否是標記,如果是,則取當前的'NumRid',否則取參數值。 – l4mpi

回答

3

__init__函數中,沒有NumRid,但您正在嘗試增加它。

如果它是一個實例變量,它應該是self.NumRid += 1;如果它是一個類變量(或者爲了防止重命名類:self.__class__.NumRid += 1),它應該是Person.NumRid += 1

0

當你在__init__你的範圍是該功能,而不是類。因此NumRid未在該範圍內定義。你應該使用它的全名,Person.NumRid來增加它。

相關問題