2016-12-28 44 views
13

Próbuję dodać lub odjąć od zdefiniowanej zmiennej, ale nie mogę wymyślić, jak zastąpić starą wartość nową. KomunikatJak zmienić zmienną po jej zdefiniowaniu w Pythonie

a = 15 

def test(): 
    a = a +10 
    print (a) 

test() 

Błąd:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    test() 
    File "test.py", line 4, in test 
    a = a +10 
UnboundLocalError: local variable 'a' referenced before assignment 
+0

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ą. –

+0

Proszę dodać kod z obrazka jako * tekst * do samego pytania. –

+0

Możliwy duplikat [UnboundLocalError w Pythonie] (http://stackoverflow.com/questions/9264763/unboundlocalerror-in-python) – approxiblue

Odpowiedz

-5

Twój błąd nie ma nic wspólnego ze jest już zdefiniowany ... Zmienna jest ważna tylko w środku jest tak zwany zakres: Jeśli utworzyć zmienną w funkcji to jest zdefiniowany tylko w tej funkcji.

def test(): 
    x=17 
    print(x) # returns 17 

test() 
print(x) # results in an error. 
2

Ty modyfikując zmienną a utworzony w zakresie funkcji test(). Jeśli chcesz outter a zostać zmodyfikowana można zrobić:

a = 15 

def test(): 
    global a 
    a = a + 1 
    print(a) 

test() 
+2

Podczas używania 'global 'rozwiązuje natychmiastowy problem, jest to zła praktyka programowania i nie powinieneś naprawdę uczyć go jako rozwiązania dla początkującego, nie wskazując jednocześnie, że jest to zarówno kiepska praktyka, jak i prosta do uniknięcia. 'global 'naprawdę nie powinno być używane przez kogoś, kto jeszcze nie do końca rozumie, dlaczego zazwyczaj jest to niewłaściwe. –

+0

Masz rację i przedstawiam swoje usprawiedliwienie za brak wyrażenia złego wyboru użycia globalnego. Za chwilę zaktualizuję odpowiedź, aby to wyrazić. Dzięki wielkie. @ZeroPiraeus – d4vsanchez

15

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 
+1

Zanim ktoś zauważy, że 'x' faktycznie otrzymał * zastąpiony * zamiast * zmieniony * ... Wiem. Musiałem już pokryć sporo ziemi, aby właściwie odpowiedzieć na pytanie, i postanowiłem nie otwierać tej konkretnej puszki z robakami. –

2

Chciałbym zrobić to w ten sposób:

def test(a): 
    a = a +10 
    return a 

print(test(15)) 

Należy zauważyć, że w proponowanej wersji są różne rzeczy od Ciebie.

Po pierwsze, to, co zapisałem, stworzyło funkcję, która jako wartość wejściowa ma wartość a (w tym przypadku ustawioną na 15, gdy wywołujemy funkcję - już zdefiniowaną w ostatniej linii -), a następnie przypisuje do obiektu wartość (która była 15) oraz 10, a następnie powraca do (który został zmieniony i jest teraz 25), a w końcu, druki się dzięki ostatniej linii kodu :

print(test(15)) 

Zauważ, że co że tak naprawdę nie była to czysta funkcja. Zazwyczaj chcemy, aby funkcje pobierały wartość wejściową (lub kilka) i zwracały wartość wejściową (lub kilka). W twoim przypadku miałeś wartość wejściową, która była rzeczywiście pusta i nie ma wartości wyjściowej (ponieważ nie użyłeś return). Poza tym, próbujesz zapisać to wejście poza funkcją (która, gdy ją wywołałeś, mówiąc: test(a), wartość nie została załadowana, a otrzymałeś błąd -ie w oczach komputera była "pusta").

Ponadto, chciałbym was zachęcić, aby przyzwyczaić się do pisania zwrot wewnątrz funkcji, a następnie za pomocą wydruku, gdy nazywają go (tak jak pisałem w ostatnim wierszu Kodowanie: print(test(15))) zamiast go używać wewnątrz funkcji . Lepiej używać drukowania tylko wtedy, gdy wywołujesz funkcję i chcesz zobaczyć, co ta funkcja faktycznie robi.

Przynajmniej tak mi pokazali na podstawowych lekcjach programowania. Można to uzasadnić w następujący sposób: jeśli używasz zwrotu w funkcji, funkcja da ci wartość, którą można później wykorzystać w innych funkcjach (tj. Funkcja, z którą możesz pracować). W przeciwnym razie wyświetlony zostanie tylko numer wyświetlony na ekranie z wydrukiem , ale komputer nie może dalej z nim pracować.

P.S. Można zrobić to samo w ten sposób:

def test(a): 
    a +=10  
    return a 

print(test(15)) 
+3

Dlaczego nie po prostu: 'def test (a): return a + 10'? – boardrider

-3
# All the mumbo jumbo aside, here is an experiment 
# to illustrate why this is something useful 
# in the language of Python: 
a = 15 # This could be read-only, should check docs 

def test_1(): 
    b = a + 10 # It is perfectly ok to use 'a' 
    print(b) 

def test_2(): 
    a = a + 10 # Refrain from attempting to change 'a' 
    print(a) 

test_1() # No error 
test_2() # UnboundLocalError: ... 
Powiązane problemy