Mam pytanie o przekazanie zmiennych z funkcji do innej funkcji przy użyciu tego kodu:

def Hello():
    good = "Nice"
    return good

def Bye():
    print (good)

Hello()
Bye()

Zwraca "Global Name" Good "nie jest zdefiniowany"

Jak mogę rozwiązać ten problem? Dzięki

0
Jo Spieder 25 czerwiec 2017, 17:00

4 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz zmiennej good, aby być dostępnym dla innych funkcji bez konieczności uruchamiania funkcji Hello, powinieneś zadeklarować dobrą funkcję globalną.

def Hello():
    global good
    good = 'Nice'
    ...
1
benjaminudoh10 25 czerwiec 2017, 14:18

Dzięki temu musisz użyć zmiennych globalnych, które są dostępne dla każdej funkcji w każdym slajdzie. Oto film, który pokaże Ci, jak ukończyć rzeczą, której szukasz. https://youtu.be/lcem0r7mwjk. Mam nadzieję, że otrzymasz odpowiedź, której szukasz.

Denis Granulo.

0
Hafted 25 czerwiec 2017, 14:39

Istnieje prostsze rozwiązanie, które uważnie śledzą oryginalny kod:

def Hello():
    good = "Nice"
    return good

def Bye():
    print (good)

good = Hello()
Bye()

Python utrzymuje zmienne zdefiniowane w lokalnym zakresie lokalnym, dlatego nie można odczytać good poza swoją funkcją, chyba że jawnie go zwrócisz (i przechowujesz go). Python również nie pozwala na pisanie do zmiennych zdefiniowanych w większym zakresie, chyba że przekazujesz je jako argument wejściowy lub użyj dyrektywy global. Ale OP nie prosił, aby napisać do dobrego w innej funkcji. Python pozwala odczytać zmienne z większego zakresu. Więc wszystko, co musisz zrobić, to przechowywać zmienną good w większym zakresie, został zwrócony już przez funkcję OP Hello.

1
Bastiaan 26 czerwiec 2017, 02:58

Musisz dowiedzieć się o zakresach. Zmienna good istnieje tylko w zakresie funkcji {X1}} - poza tym funkcją zmienna nie jest znana.

W twoim przypadku należy przechowywać wartość zwracania Hello w zmiennej - a następnie przekazać tę zmienną do funkcji Bye:

def Hello():
    good = "Nice"
    return good

def Bye(g):
    print (g)

g = Hello()
Bye(g)

Z Dokumenty:

Zakres określa widoczność nazwy w bloku. Jeśli zmienna lokalna jest zdefiniowana w bloku, jego zakres obejmuje ten blok. Jeśli definicja występuje w bloku funkcyjnym, zakres rozciąga się na dowolne bloki zawarte w określonym, chyba że zawartej blok wprowadza inną wiązanie dla nazwy.

[…]

Po znalezieniu nazwy w ogóle podniesiony jest wyjątek NameError. Jeśli obecny zakres jest zasięgiem funkcji, a nazwa odnosi się do zmiennej lokalnej, która nie została jeszcze związana z wartością w punkcie, w którym używana jest nazwa, podniesiono wyjątek UnboundLocalError. UnboundlocalError jest podklasą NameError.

1
Mike Scotty 25 czerwiec 2017, 14:03