2010-08-02 259 views
0
class AlphaBetaAgent(MultiAgentSearchAgent): 

    def action(self,gamestate): 
    self.alpha= -9999 
    self.beta = 9999 

    def abc(gamestate, depth, alpha, beta): 


    def bvc(gamestate, depth, alpha, beta): 


    return abc(gamestate, 0, alpha, beta) 

我在調用getAction函數,它本身調用調用bvc函數的abc funct和abc函數。函數abc和bvc以遞歸方式工作。我需要根據情況需求修改alpha和beta的值,所以我將它們設置爲本地。它不讓我這樣做。發生錯誤時python中的全局變量

錯誤: - 全球名「阿爾法」是沒有定義

+6

請修復您的縮進。在Python中,它很重要。 – Thomas 2010-08-02 20:56:09

+0

是的,它使它很難讀;) – 2010-08-02 20:58:50

+0

我建議重寫你的函數,以便它實際上做了一些事情,而不是無用地給函數參數賦值並試圖返回一個沒有返回值的函數的值。 – JAB 2010-08-02 21:07:55

回答

0

要使用你所要做的像一個全局變量:

全球阿爾法
阿爾法= -9999

+0

當我將alpha&beta的值放入函數內部時,不會出現像全局名稱「alpha」未定義的錯誤。當我宣佈阿爾法和beta以外def abc時,那麼它工作正常。我想使用alpha和beta的局部變量。 – Shilpa 2010-08-02 21:04:09

3

在Python中,全局變量必須在函數之外聲明。然後,任何函數都可以讀取這個變量沒有任何問題,但是如果一個函數想寫它,它必須聲明它是全局的。例如:

def fun1(): 
    print a 
def fun2(): 
    a = 3 
def fun3(): 
    global a 
    a = 3 
a = 0 
fun1() # <- Will work 
fun2() # <- Will raise exception 
fun3() # <- Will work 
+0

name'beta'是一個函數參數並聲明爲全局 - 當我應用您的方法時發生此類錯誤 – Shilpa 2010-08-02 21:08:29

+0

我不確定您的問題到底是什麼。如果你想在一個函數中使用局部變量並且操作它們而不用擔心全局變量,那通常工作正常。通過在函數中聲明一個函數,我不確定你在做什麼。你嘗試過類嗎? – 2010-08-02 21:17:13

+0

有一個函數Ge​​taction被定義的類,在getAction函數中,我做了2個函數 – Shilpa 2010-08-02 21:21:26

2

使用一個類。存儲狀態&行爲是類的用途。

+0

+1:並且避免了全局變量。他們往往是一個可怕的設計失誤。 – 2010-08-02 21:11:19

1

如果你想要像abcbvc功能,使用普通的變量,一般要定義對象他們是方法,就像這樣:或者

class ActionState(object): 
    def abc(self, gamestate, depth): 
     self.alpha = -9999 
     self.beta = 9999 
    def bvc(self, gamestate, depth): 
     self.alpha = -9999 
     self.beta = 99999 

def action(self, gamestate): 
    state = ActionState() 
    state.abc(gamestate, 0) 

,如果你真的想,你可以附上一個可變的物體,像字典圍繞牽你的數據:

def action(self, gamestate): 
    actionstate = { 'alpha': 0, 'beta': 0 } 

    def abc(gamestate, depth): 
     actionstate['alpha'] = -9999 
     actionstate['beta'] = 9999 

    def bvc(gamestate, depth): 
     actionstate['alpha'] = -9999 
     actionstate['beta'] = 9999 

    abc(gamestate, 0) 

注意,actionstate參數不經過這裏 - 這是從封閉的範圍繼承。如果你願意的話,你可以通過它明示,在這種情況下abcbvc不再需要在action的內部定義。這是行得通的原因,你的例子並不是Python將任何原語標識符詞法綁定到分配給它的最本地函數。因此,當您在abc中指定alpha時,Python將alpha定義爲abc,而不是action。我相信在Python中獲得閉包的唯一方法是不要將內部函數分配給封閉變量。

+0

abc和bvc函數在函數getAction中定義。那麼我在哪裏準確地定義我的alpha和beta ....我不能使用self.alpha? – Shilpa 2010-08-02 21:24:50

+0

'alpha'和'beta'必須被定義爲在'abc'和'bvc'的定義之上創建的字典或對象的組件。這樣,您可以分配給他們,而無需在更多本地範圍中創建第二個版本。在答案結尾處查看添加的解釋。 – 2010-08-02 21:27:08

+0

另外,爲什麼你不能使用'self.alpha'? – 2010-08-02 21:28:11