błędu, że pojawi się podczas próby uruchomienia kodu jest:
UnboundLocalError: local variable 'a' referenced before assignment
..., która na pierwszy rzut oka, Wydaje się dziwne: w końcu oświadczenie w powyższym kodzie() jest przypisaniem. Więc co się dzieje?
W rzeczywistości zdarzają się dwie różne rzeczy i żadna z nich nie jest oczywista, chyba że już o nich wiesz.
Przede wszystkim, trzeba rzeczywiście dwie różne zmienne:
a
w pierwszej linii jest zmienna globalna (tzw ponieważ istnieje w zasięgu globalnym, poza żadnej definicji funkcji).
W innych wierszach a
jest zmienną lokalną, co oznacza, że istnieje tylko wewnątrz funkcji test()
.
Te dwie zmienne nie są ze sobą całkowicie powiązane, mimo że mają taką samą nazwę.
Zmienna jest lokalna dla funkcji, jeśli istnieje instrukcja przypisująca jej wewnątrz tej funkcji - na przykład twoja linia a = a +10
.
Mimo to błąd nadal wygląda dziwnie - w końcu pierwszą rzeczą, którą robisz w numerze test()
, przypisuje się a
, więc jak można się z nim wcześniej połączyć?
Odpowiedź jest taka, że w instrukcji przypisania, Python ocenia wszystko z prawej strony znaku =
przed przypisaniem go do nazwy na lewej stronie - tak, mimo że przypisanie napisany pierwszy w kod, a
otrzymuje , do którego odnosi się najpierw po prawej stronie: a +10
.
Istnieją dwa sposoby obejścia tego problemu.Pierwszy to powiedzieć Python, że naprawdę chcesz a
wewnątrz test()
być taka sama a
w zakresie globalnym:
def test():
global a
a = a + 10
print(a)
to będzie działać, ale jest to bardzo zły sposób pisać programy. Zmiana globalnych zmiennych w funkcjach staje się trudna do opanowania bardzo szybko, ponieważ zwykle masz wiele funkcji i żadne z nich nie może być pewne, że inny nie będzie się bał z globalną zmienną w taki sposób, jakiego się nie spodziewa.
Lepszym sposobem jest przekazywanie zmiennych jako argumenty funkcji, jak poniżej:
a = 15
def test(x):
x = x + 10
print(x)
test(a)
Zauważ, że nazwa nie musi być taki sam - swoją nową definicję test()
po prostu mówi, że przyjmuje wartość, a następnie coś z nią. Możesz przekazać wszystko, co chcesz - może to być a
lub numer 7
lub coś innego. W rzeczywistości Twój kod będzie zawsze łatwiejszy do zrozumienia, jeśli spróbujesz uniknąć zmiennych o tej samej nazwie w różnych zakresach.
Jeśli grasz z powyższym kodzie, zauważysz coś ciekawego:
>>> a = 15
>>> test(a)
25
>>> a
15
... a
nie zmieni! Dzieje się tak, ponieważ chociaż przekazałeś go pod numer test()
i został on przypisany do x
, został zmieniony x
, pozostawiając oryginalny a
sam.
Jeśli chcesz faktycznie zmienić a
, trzeba przywrócić zmodyfikowane x
z funkcji, a następnie przypisać go do a
na zewnątrz:
>>> a = 15
>>>
>>> def test(x):
... x = x + 10
... print(x)
... return x
...
>>> a = test(a)
25
>>> a
25
może się okazać, że trzeba spacji po znaku plus. Swift będzie także dawał błędy, jeśli znaki nie są oddzielone spacją. –
Proszę dodać kod z obrazka jako * tekst * do samego pytania. –
Możliwy duplikat [UnboundLocalError w Pythonie] (http://stackoverflow.com/questions/9264763/unboundlocalerror-in-python) – approxiblue