2016-09-23 79 views
0

中的另一個函數調用。我正在創建一個程序,遇到了一個讓我困惑的問題,以及對基本代碼的理解(或者我對視力的理解)。如果語句值在循環中沒有改變,如果從python

根據我這個代碼應該打印出來

測試

立即在程序啓動,然後當EXT()是由定時器稱爲線程循環變量會更改爲False,實質上在if語句中返回false並且不繼續打印出'Test'。

但即使ext()被調用(我測試了這個),if語句被調用並且循環不會更改爲False。

from threading import Timer, Thread 
from time import sleep 

loop = True 

def hello(): 
    while True: 
     if loop == True: 
      print('Test') 
      sleep(0.5) 

def ext(): 
    loop = False 

th = Thread(target=hello) 
th.start() 

t = Timer(5, ext()) 
t.start() 

請幫忙,因爲我一直堅持了幾個小時。

+2

'ext'中的'loop'變量在本地範圍內。你可以考慮使用'global'' –

+1

確保你通過'global loop'使用全局變量,然後'loop = False'。 – Li357

+1

您必須將該變量設爲全局變量。檢查[this](http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them) – MikeVelazco

回答

0

您需要指定loop作爲全局變量。在ext()中,它認爲您正在定義一個名爲loop的新變量,而您實際上想要修改全局變量。所以,正確的代碼會是這樣:

from threading import Timer, Thread 
from time import sleep 

loop = True 

def hello(): 
    while True: 
     if loop == True: 
      print('Test') 
      sleep(0.5) 

def ext(): 
    global loop 
    loop = False 

th = Thread(target=hello) 
th.start() 

t = Timer(5, ext) 
t.start() 

您還需要改變的人最後一行之前,而不是調用ext它傳遞給Timer

+0

嘗試運行它...它不太正確。 – tdelaney

+0

我正在運行它。有用。問題在於它保留在'while True'循環中,因爲沒有睡眠或從該函數返回。但這不是問題 – afsafzal

+0

嗨,感謝您的答覆。 Btw在Python 2.7和Python 3之間使用全局變化嗎? –

0

你有兩個問題......好吧,三真。首先,ext引用了一個名爲loop而非全局的局部變量。其次,你並不真正開始線程,因爲你調用了函數而不是傳入參考。第三...當你設置了loop時你不再睡覺,所以你的代碼最終會在一個緊密的循環中吃完整個cpu。修正前兩個將是

from threading import Timer, Thread 
from time import sleep 

loop = True 

def hello(): 
    while True: 
     if loop == True: 
      print('Test') 
      sleep(0.5) 

def ext(): 
    global loop 
    loop = False 

th = Thread(target=hello) 
th.start() 

t = Timer(5, ext) 
t.start()