2016-04-11 4 views
0

Heute habe ich einige Dinge getestet, die ich für meinen neuen Code benötige, aber ich habe ein Problem. Ich habe den Code auf den folgenden Code reduziert:Python 2.7 - Globale Variable wird nicht aktualisiert (mit Funktionen)

def SomeFunction(): 
    global Turn 
    if Turn == 1: 
     #some code 
     Turn = 0 

    if Turn == 0: 
     #some code 
     Turn = 1 

    print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

Das Problem, das ich habe, ist, dass diese Funktion drucken 1, zehn Mal. Was ich will, ist, dass es 1, dann 0, dann 1 und so weiter druckt.

Ich habe mir einige existierende Stack-Überlauf-Posts angeschaut, aber alle schlagen vor, dass ich python die Variable Turn in der Funktion global mitteilen muss, aber da ich das schon mache, ist das verwirrend für mich.

Ich muss jedoch globale Variablen verwenden, also ist die Verwendung nur lokaler Variablen nicht die Lösung.

Grüße, Harm

+6

Gehen Sie die Ausführung mit Stift und Papier durch. Ja, das Ergebnis wird immer "1" sein. Vielleicht möchtest du ein *** 'elif' *** zum zweiten Mal benutzen. – deceze

Antwort

1

Wenn Turnist gleich 1 die erste if Bedingung wahr sein wird, so wird Turn auf 0 gesetzt bekommen, aber dann geht die Ausführung auf den zweiten if Bedingung, die jetzt ist True, so Turn wird auf 1 zurückgesetzt werden.

Die sinnvolle Art und Weise, damit umzugehen ist zu verwenden elif, wie andere erwähnt haben. Alternativ können Sie die print in beide Zweige duplizieren und eine frühe return in der ersten Zweigstelle setzen. Die elif Ansatz ist besser, weil es die Code-Duplizierung vermeidet, und es ist auch ein guter Stil zu früh zu vermeiden return s, wenn Sie können. Aber ich werde Sie den Code zeigen trotzdem:

def SomeFunction(): 
    global Turn 
    if Turn == 1: 
     #some code 
     Turn = 0 
     print Turn 
     return 

    if Turn == 0: 
     #some code 
     Turn = 1 
     print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

Ausgang

0 
1 
0 
1 
0 
1 
0 
1 
0 
1 

BTW, ist die übliche Python Konvention niedriger Fall für einfache Variable und Funktionsnamen zu verwenden. Groß- und CamelCase-Namen werden für Klassennamen verwendet. Natürlich haben Sie nicht haben, diese Konvention zu folgen, aber wenn Sie nicht machen es Ihren Code seltsam aussehen, wenn mit den meisten Syntax-Highlighting-Software gesehen, so dass es unnötig für den Rest der Python-Community verwirrend ist.

Weitere Informationen finden Sie unter PEP 0008 -- Style Guide for Python Code.


Eigentlich kann man einen Wert zwischen Null und Eins abwechselnd eine if Anweisung ohne Verwendung. Der Trick ist, den Exklusiv-ODER-Operator zu verwenden, ^:

def SomeFunction(): 
    global Turn 
    Turn ^= 1 
    print Turn 

Turn = 1 
for i in range(10): 
    SomeFunction() 

Das nach wie vor in der gleichen Ausgabe führt.

Wenn eine Variable nur jemals nimmt auf den Werten Null und Eins Sie bei einem boolean statt machen in Betracht ziehen sollten, und haben sie wechseln zwischen False und True, so dass mehr lesbaren Code führen kann. Sie können es abwechselnd mit:

Turn = not Turn 

und Sie können einen Booleschen Wert in arithmetischen Ausdrücken verwenden, wo es gerade wie 0 oder 1 verhalten, auch wenn einige Leute das tun nicht mögen, und halten es weniger lesbar.


Ich glaube, ich sollte auch erwähnen, dass Sie versuchen sollten, mit global zu vermeiden. Es kann praktisch sein, aber die Verwendung modifizierbarer Globals bricht die Modularität des Codes. Es ist keine große Sache für kleine Skripte, aber Sie werden das modulare Design wirklich schätzen, wenn Sie große komplexe Programme schreiben.

+0

ah ich sehe, ich benutze normalerweise elif, aber ich dachte, dass es in diesem Fall nicht benötigt wurde, aber das war ziemlich dumm zurückblicken. Übrigens, ich benutze Großbuchstaben, weil ich denke, dass sie auf diese Weise leichter zu lesen sind, aber danke, dass Sie darauf hingewiesen haben. Ich versuche, die PEP zu folgen, aber nie darüber nachgedacht, wie ich Variablen benenne :) –

+0

@HarmPrins: FWIW, es gibt tatsächlich eine _much_ effizientere Möglichkeit, eine Variable zwischen 0 und 1 zu spiegeln. Ich werde mehr Code zu meiner Antwort hinzufügen. –

+0

Scheint wie eine effiziente Lösung, aber in meinem Fall verwende ich verschiedene Teile des Codes abhängig von der Turn-Variable. Ich versuche auch immer, globale Variablen zu vermeiden, aber in diesem Fall kann ich es nicht vermeiden. Ich benutze Tkinter und ein 9x9 Raster mit Knöpfen. Jede Schaltfläche ruft die gleiche Funktion auf, aber mit unterschiedlichen Argumenten, aber da die Schaltflächen am Anfang des Programms initialisiert werden, kann ich die Turn-Variable nicht als Argument senden. –

1

Das Problem ist, dass Sie einmal überschreiben drehen und wieder. Versuchen Sie es mit

elif Turn == 0: 

statt

if Turn == 0: