2017-03-16 48 views
1

我試圖循環遍歷一個函數並使用在程序的主要作用域中定義的變量,但由於某種原因,它沒有傳遞到我的函數中。這是我第一次在Python中使用函數和變量作用域,我通過Python文檔以及這裏的一些帖子閱讀,但似乎無法弄清楚我做錯了什麼。在函數中定義變量作用域

該函數將是遞歸的,因此我無法在函數頭部定義它們,否則它只會重新定義每次。我試着在我的文件中做了this的文章,但它似乎沒有工作。

我都在一個文件中的主+功能和定義我想作爲全球使用我想在使用它們的函數中的變量。

lv1Count = 12 
lv2Count = 14 
lv3Count = 18 
lv4Count = 4 
AL = [] 

def opt(target): 
    global lv4Count 
    global lv3Count 
    global lv2Count 
    global lv1Count 
    global AL 
    goal = target 

    if (goal <= 0 & lv4Count < 0): 
     pass 
    if (goal <= 1 & lv1Count < 0): 
     pass 
    if (goal == 2 & lv2Count < 0): 
     pass 
    if (goal == 3 & lv3Count < 0): 
     pass 
    if (goal == 4 & lv4Count < 0): 
     pass 

opt(4) 

我全部換成了如果與通報表爲了避免過多的代碼,但基本上每當從這些語句中返回一些內容時,使用計數器的比較不起作用,因爲它沒有成功讀取此變量的值,並且不會發生該功能。

+0

你能解釋一下到底是什麼你想幹什麼? 「全球化」並不是一個好主意,但除此之外,我沒有理由不「成功讀取價值」:你是什麼意思? – brianpck

回答

1

你的函數正常工作:這確實是你如何使用全局變量,即使它通常是一個壞主意。 (在遞歸中,最常見的方式是將必要的值作爲參數傳遞給函數。)如果包含更多關於您想要執行的遞歸類型的詳細信息,我可以提供幫助。

In [1]: v = 1 

In [2]: def test(): 
    ...:  global v 
    ...:  return v 
    ...: 

In [3]: test() 
Out[3]: 1 

問題是與您的if聲明:您使用的不是正常的邏輯運算and的按位&。由於&首先按照操作順序進行評估,因此會出現問題。考慮:

In [1]: bool(1 == 1 & 2 == 2) 
Out[1]: False 

爲什麼?因爲這個被評價爲:

In [1]: bool(1 == (1 & 2) == 2) 
Out[1]: False 

這是一樣的:

In [1]: bool(1 == 0 == 2) 
Out[1]: False 
+0

當然,讓我更具體。雖然我不太瞭解遞歸,但除了它自己正在調用它之外。我基本上想要循環並檢查參數中傳遞的值是否大於給定數字,如果是,我想從原始傳遞值中減去此值並再次循環該函數,直到傳遞的值更少大於或等於零。這個想法是爲了最終返回程序中下一步在數組列表中使用的每種計數/點值的數量。 (對不起,在手機上出現任何拼寫錯誤) – Infinitylsx

+0

剛上電腦,能夠實現從'&'到'和'關鍵字的變化,這肯定是問題!非常感謝你讓我知道,我來自Java,因此在查看文檔時看到按位運算符,這讓我認爲它是相同的功能。我可以問什麼時候使用按位運算符而不是'和'關鍵字? – Infinitylsx

+0

@Infinitylsx實際上按位與&在Java中的工作方式相同:邏輯運算符'和'與Java中的&&相同。有很多關於SO的問題可以解釋什麼是按位操作是有用的! – brianpck