2017-05-02 22 views
-1

所以我正在做彩票號碼拉絲機,「DRAW1」沒有定義,高度困惑

import random 

def lottoDraw1(): 
    draw1 = random.randint(1,49) 

def lottoDraw2(): 
    draw2 = random.randint(1,49) 
    if draw2 == draw1: 
     lottoDraw2() 

而且我得到的錯誤「NameError:名字‘DRAW1’沒有定義」

如果我插入:

draw1 = 0

代碼之前,答案始終是0 即使我定義draw1改變。

我在做什麼錯?

+0

那個時候的變量本地定義會發生什麼...... –

+0

對不起我在輸入代碼時陷入了困境,導入random是代碼塊的一部分,並且「if draw2 == draw1:lottoDraw2()」在 –

+0

之下的行上請注意最好的答案 –

回答

2

What are Python namespaces all about 這個問題是要求命名空間,這是基本上你遇到的問題。在lottodraw1中,您只是更改draw1的本地版本,因此draw1的全局值保持不變(在您的情況下爲0)。爲此,您將始終在其他地方使用draw1 = None

我的辦法將作出的畫數組,並具有一般繪製函數:

draws = [] 

def draw(): 
    new_draw = random.randint(1,49) 
    if new_draw not in draws: 
     draws.append(new_draw) 
    else: 
     draw() 

draw() 
draw() 
print(draws) 

現在你可以叫得出,它會增加一個新繪製的數字,還不存在。

正如讓·弗朗索瓦·法布爾指出,更好的版本會使用套,這是快,但只允許唯一值:

draws = set() 

def draw(): 
    new_draw = random.randint(1,49) 
    if new_draw not in draws: 
     draws.add(new_draw) 
    else: 
     draw() 

draw() 
draw() 
print(draws) 
+1

不錯。我會使用'set'來快速查找BTW。 –

+1

使用這種方法,如果'new_draw'已經在'draws'中,'draw()'不會繪製任何東西。你可以嘗試一個新的隨機數,就像OP的代碼一樣,但是有一些方法可以更好地跟蹤哪些數字已經被繪製出來。 –

+0

@ Jean-FrançoisFabre謝謝你指出,我做了一個編輯,以說明你的建議 –

0

你需要讓draw1爲全局變量

draw1, draw2 = None, None 

def lottoDraw1(): 
    global draw1 
    draw1 = random.randint(1,49) 

def lottoDraw2(): 
    global draw1 
    global draw2 
    draw2 = random.randint(1,49) 
    if draw2 == draw1: 
     lottoDraw2() 

然而,這是不是一個好方法這是另外一個話題。

+0

對不起,現在輸出「draw1」和「draw2」是「None」,而不是1,49之間的randint。 –

+0

你是如何執行此操作的。你只寫了你的兩個函數。你是怎麼調用/調用的? –

+0

代碼讀取結束lottoDraw1(), lottoDraw2().___ print(draw1), print(draw2)。 –