2016-09-23 7 views
0

dort aufgerufen wird. Ich habe ein Programm erstellt und bin auf ein Problem gestoßen, das mich und mein Verständnis des Basiscodes (oder meines Verständnisses meiner Sehkraft) verwirrt.If Anweisung Wert nicht in Schleife ändern, wenn von einer anderen Funktion in Python

Nach mir soll dieser Code aus drucken

-Test

sofort als das Programm gestartet wird und dann, wenn ext() von Timer-Thread der Schleifenvariable genannt wird, auf False ändern, im Wesentlichen Rückgabe false auf der if-Anweisung und nicht weiter "Test" auszudrucken.

Aber obwohl ext() aufgerufen wird (ich testete dies), wird die if-Anweisung aufgerufen, und loop ändert sich nicht in 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() 

Bitte helfen Sie mir, wie ich für mehrere Stunden festgefahren bin.

+2

Die 'loop' Variable in' ext' ist lokal begrenzt. Sie können die Verwendung von 'global' erwägen. –

+1

Stellen Sie sicher, dass Sie globale Variable mit' global loop' verwenden und dann 'loop = False'. – Li357

+1

Sie müssen die Variable als global zuweisen. Überprüfen Sie [diese] (http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them) – MikeVelazco

Antwort

0

Sie müssen loop als globale Variable angeben. In ext() denkt es, dass Sie eine neue Variable namens loop definieren, während Sie die globale Variable tatsächlich ändern möchten. Also der richtige Code wäre diese:

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() 

Sie müssen auch vor der letzten Zeile die eine ändern und statt der Aufruf ext Pass es zu Timer

+0

Versuchen, es zu laufen ... es ist nicht ganz richtig. – tdelaney

+0

Ich führe es. Es klappt. Die Sache ist, dass es in der "while True" -Schleife bleibt, weil es keinen Schlaf oder Rückkehr von dieser Funktion gibt. Aber das war nicht die Frage – afsafzal

+0

Hallo, danke für die Antworten. Btw nutzt überhaupt die globale Veränderung zwischen Python 2.7 und Python 3? –

0

Sie haben zwei Probleme ... na ja, drei wirklich . Zuerst referenziert ext eine lokale Variable namens loop nicht die globale. Zweitens starten Sie den Thread nicht wirklich, weil Sie die Funktion aufgerufen haben, anstatt ihre Referenz zu übergeben. Drittens ... du schläfst nicht mehr, wenn loop eingestellt ist, damit dein Code eine volle CPU in einer engen Schleife isst. Das Fixieren der ersten beiden wäre

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() 
Verwandte Themen