Porównaj ceny domen i usług IT, sprzedawców z całego świata

Python 3 builtins.NameError: nazwa globalna - - - undefined -


Potrzebuję tutaj wskazówek. To chyba głupi błąd, ale pojawia się błąd „builtins.NameError: global-name-undefined” i nie rozumiem dlaczego - nadal uczę się języka :).
Oto mój kod:
def option(x):
if x == "E":
enter()
elif x == "V":
view()
else:
exit()def enter():
msg = input("Enter the message\n")
main()def view():
##if msg == 0:
#print("no message yet")
#main()
#else:
print("The message is:", msg )
main() def exit():
print("Goodbye!")
def main():
print("Welcome to BBS")
print("MENU")
print("(E)nter a message")
print("(V)iew message")
print("e(X)it")
print("Enter your selection:")
choice = input()
option(choice)
#msg = 0main()

Mój problem polega na tym, że otrzymuję to, mimo że najpierw wybieram opcję „E”:
Traceback (most recent call last):
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 36, in <module>
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 33, in main
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 3, in option
pass
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 11, in enter
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 33, in main
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 5, in option
File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 18, in view
builtins.NameError: global name 'msg' is not defined

Mógłbyś mnie wyprowadzić? Szukałem informacji i nic nie znalazłem, i dochodzę do wniosku, że jest to prawdopodobnie coś naprawdę głupiego i noobowego.
Ponadto, jak widzicie z tego, co skomentowałem, próbowałem ograniczyć „widok” przed wyrzucaniem błędu, sprawdzając, czy msg! = 0 - zrobiłem msg = 0 w main () - to oczywiście nie działa, ponieważ po przekazując enter (), wraca do main () i znowu msg == 0. Czy moglibyście połączyć mnie ze stroną/instrukcją, która pomoże mi znaleźć rozwiązanie tego problemu? Nie chcę być tak często karmiony łyżką ...
Podziękować,
Itachi
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Problem polega na tym, że
msg
wewnątrz
enter ()
jest zmienną lokalną: jest tworzona, gdy funkcja
enter ()
jest uruchamiana i przestaje działać istnieje po powrocie
enter ()
. Zwykle ustawiając zmienną wewnątrz funkcji, ustawiasz zmienną lokalną. Jeśli chcesz zainstalować

światowy

zmienna, która zachowuje swoją wartość nawet po zwróceniu funkcji, użyj instrukcji
global
:
def enter():
global msg
msg = input("Enter the message\n")
main()

Jednak globalne często nie są najlepszym sposobem robienia rzeczy. Może lepiej byłoby, gdyby funkcja
enter ()
zwracała wiadomość, zamiast przechowywać ją w zmiennej.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

msg
to nazwa, której nie należy nigdzie używać. Dlatego otrzymujesz
NameError
.
Każda z tworzonych funkcji powinna być niezależna i mieć proste wejścia i wyjścia.
main
to punkt wejścia i w razie potrzeby powinien wywoływać inne funkcje.
Funkcje te powrócą do wywołującego po zakończeniu wykonywania. Mogą, aw niektórych przypadkach powinni, zwrócić pewną ilość danych z powrotem do swojego abonenta.
Na przykład, oto podzbiór Twojego problemu, pokazujący, jak
main
wywołuje
view
, a następnie zwraca:
def view(text):
if not text:
print("no message yet")
else:
print("The message is:", msg )def main():
print("Welcome to BBS")
print("MENU")
print("(E)nter a message")
print("(V)iew message")
print("e(X)it")
print("Enter your selection:")
while not exiting:
choice = input()
view(choice)
exiting = True # TODO: set this based on the value in choice

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się