2017-12-30 13 views
1

Ich versuche, ein History-Quiz von verschiedenen Schwierigkeiten mit Funktionen zu programmieren, aber habe Probleme mit "globalen Namen" bekommen. Ich habe versucht, dies zu korrigieren, aber nichts scheint zu funktionieren.Probleme mit globalen Variablennamen und verschiedenen Funktionen (mit Python)

Der Snippet-Code ist:

#Checking Answers 
def checkEasyHistoryQuestions(): 
    score = 0 
    if hisAnswer1E == 'B' or hisAnswer1E == 'b': 
     score = score + 1 
     print "Correct!" 
    else: 
     print "Incorrect!" 

    if hisAnswer2E == 'A' or hisAnswer2E == 'a': 
     score = score + 1 
     print "Correct!" 
    else: 
     print "Incorrect!" 

    if hisAnswer3E == 'B' or hisAnswer3E == 'b': 
     score = score + 1 
     print "Correct!" 
    else: 
     print "Incorrect!" 

    print score 
    print "\n" 

#History - Easy - QUESTIONS + INPUT 
def easyHistoryQuestions(): 
    print "\n" 
    print "1. What date did World War II start?" 
    print "Is it:", "\n", "A: 20th October 1939", "\n", "B: 1st September 1939" 
    hisAnswer1E = raw_input("Enter your choice: ") 
    print "\n" 

    print "2. When did the Battle of Britain take place?" 
    print "Is it: ", "\n", "A: 10th July 1940 – 31st October 1940", "\n", "B: 3rd July 1940- 2nd August 1940" 
    hisAnswer2E = raw_input("Enter your choice: ") 
    print "\n" 

    print "3. Who succeeded Elizabeth I on the English throne?" 
    print "Is it: ", "\n", "A. Henry VIII", "\n", "B. James VI" 
    hisAnswer3E = raw_input("Enter your choice: ") 
    print "\n" 

checkEasyHistoryQuestions() 

Der Fehler Ich erhalte ist:

if hisAnswer1E == 'B' or hisAnswer1E == 'b': 
NameError: global name 'hisAnswer1E' is not defined 

ich versucht habe hisAnswer1E als globalen Variable in der Funktion als gut als außerhalb zu erklären.

Zum Beispiel:

print "\n" 
print "1. What date did World War II start?" 
print "Is it:", "\n", "A: 20th October 1939", "\n", "B: 1st September 1939" 
global hisAnswer1E 
hisAnswer1E = raw_input("Enter your choice: ") 
print "\n" 

Und auch:

global hisAnswer1E 

#Checking Answers 
def checkEasyHistoryQuestions(): 
    score = 0 
    if hisAnswer1E == 'B' or hisAnswer1E == 'b': 
     score = score + 1 
     print "Correct!" 
    else: 
     print "Incorrect!" 

Nichts scheint zu funktionieren und ich halte nur den gleichen Fehler. Irgendwelche Ideen warum?

+1

Warum sie nicht als Parameter übergeben ? –

+0

Es gibt einige Probleme mit Ihrem Programm: Sie starten nie die Methode easyHistoryQuestions. Innerhalb des Körpers dieser Funktion werden Sie den Benutzer trotzdem nach Eingabe fragen, aber Sie überschreiben diese Antwort jedes Mal. Dann wird die andere Funktion niemals auf diese Werte zugreifen, da sie nicht global sind.Ich würde im Moment vorschlagen, dies ohne irgendeine Funktion zu tun und dann zu versuchen, mit Funktionen zu refaktorieren, sobald Sie den Dreh raus haben. – Axnyff

+0

@StephenRauch Ich dachte, Sie könnten nur 2 Parameter übergeben? – qwe

Antwort

0

Um eine globale Variable in Python zu verwenden, ich glaube, Sie sollten die Variable ohne das Schlüsselwort global außerhalb der Funktion deklarieren, und es dann mit erklären das Schlüsselwort global innerhalb der Funktion.

x=5 
def h(): 
    global x 
    x=6 

print(x) 
h() 
print(x) 

würde Dieser Code

5 
6 

jedoch globale Variablen drucken in der Regel zu vermeiden, etwas zu.

+0

Warum würden Sie das empfehlen? –

+0

Aber wenn ich zum Beispiel "hisAnswer1E = 0" außerhalb der Funktion sagte, würde das meine Antwort nicht ändern? Es würde dann dazu führen, dass alle meine Antworten inkorrekt sind, wenn sie tatsächlich richtig waren. – qwe

+0

@StephenRauch Ich empfehle eigentlich nicht die Verwendung globaler Variablen, ich habe nur versucht zu erklären, wie man sie in Python verwendet. Ich habe meine Antwort bearbeitet. Vielen Dank! –

2

Deklarieren global hisAnswer1E bedeutet "verwenden hisAnswer1E aus globalen Bereich". Es erstellt nicht tatsächlich einen hisAnswer1E im globalen Bereich.

, also eine globale Variable zu verwenden, sollten Sie zunächst eine Variable im globalen Bereich erstellen und dann global hisAnswer1E in einer Funktion JEDOCH

erklären !!!

Ein Tipp: Verwenden Sie keine globalen Variablen. Tu es einfach nicht.

Funktionen nehmen Argumente und geben Werte zurück. Das ist der richtige Mechanismus, um Daten zwischen ihnen zu teilen.

In Ihrem Fall die einfachste Lösung (dh am wenigsten Änderungen an, was Sie bisher getan haben) ist es, die Antworten von easyHistoryQuestions zurückzukehren und sie zu checkEasyHistoryQuestions, zum Beispiel passieren:

def checkEasyHistoryQuestions(hisAnswer1E, hisAnswer2E, hisAnswer3E): 
    # <your code here> 

def easyHistoryQuestions(): 
    # <your code here> 
    return hisAnswer1E, hisAnswer2E, hisAnswer3E 

hisAnswer1E, hisAnswer2E, hisAnswer3E = easyHistoryQuestions() 
checkEasyHistoryQuestions(hisAnswer1E, hisAnswer2E, hisAnswer3E) 
Verwandte Themen