Co to jest globalne oświadczenie ? I w jaki sposób jest używany? Przeczytałem Python's official definition;
Jednak nie ma to dla mnie większego sensu.Co to jest wypowiedź globalna w języku Python?
Odpowiedz
Każdego „zmienny” w Pythonie jest ograniczona do pewnego zakresu. Zakres "pliku" Pythona to zasięg modułu. Rozważmy następujący:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
Obiekty z zakresu lokalnej umrzeć jak najszybciej wyjść funkcyjnych i nigdy nie może zostać odzyskane (chyba return
im), ale wewnątrz funkcji, można uzyskać dostęp do zmiennych w zakresie poziomu modułu (lub każdy zawierający zakres):
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
jednak nie można używać przypisanie tego odniesienia i oczekiwać, że będzie propagowane do zewnętrznej zakresie:
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
Teraz jesteśmy wreszcie na global
. Słowo kluczowe global
jest sposobem, w jaki mówisz pythonowi, że określona zmienna w twojej funkcji jest zdefiniowana w zasięgu globalnym (na poziomie modułu).
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
Innymi słowy, można zmienić wartość myvariable
w module-zakres od wewnątrz func
jeśli używasz słowa kluczowego global
.
Tak na marginesie, zakresy można zagnieżdżać dowolnie głęboko:
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
Teraz w tym przypadku żadna ze zmiennych zadeklarowana w zakresie globalnym, aw python2, nie ma (proste/clean), aby zmienić wartość x
w zakresie func1
z poziomu func3
. Dlatego słowo kluczowe nonlocal
zostało wprowadzone w python3.x. nonlocal
to rozszerzenie global
, które pozwala modyfikować zmienną pobraną z innego zakresu w zakresie, w jakim został pobrany.
+1 dla dokładnego wyjaśnienia. Możesz jednak wyświetlić wyniki instrukcji drukowania. –
@StevenRumbalski - Gotowe. Dobry pomysł. – mgilson
Testowałem to po przeczytaniu Twojej odpowiedzi i moje zrozumienie znacznie się poprawiło w tej kwestii. Dziękuję Ci bardzo! – Capurnicus
Zasadniczo mówi tłumaczowi, że zmienna podana powinna zostać zmieniona lub przypisana na poziomie globalnym, a nie domyślny poziom lokalny.
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
Można użyć zmiennej globalnej w innych funkcji, deklarując je jako globalne w każdej funkcji, która modyfikuje to
Python chce mieć pewność, że naprawdę wiesz, że to co grasz z jawnie wymagając słowo kluczowe globalne.
Zobacz this answer
mgilson wykonał dobrą robotę, ale chciałbym dodać trochę więcej.
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
wewnątrz funkcji, Python zakłada każdą zmienną jako zmiennej lokalnej chyba zadeklarować ją jako globalny, czy masz dostęp do zmiennej globalnej.
list1.append(2)
było możliwe, ponieważ użytkownik uzyskuje dostęp do "listy1", a listy są zmienne.
list2 = [222]
było możliwe, ponieważ inicjalizujesz zmienną lokalną.
Jednak jeśli Odkomentuj # list1 = [9], dostaniesz
UnboundLocalError: local variable 'list1' referenced before assignment
Oznacza to, że starają się zainicjować nową zmienną lokalną „lista1”, ale to już odwoływać wcześniej i jesteś poza zakresem, aby go ponownie przydzielić.
Aby wprowadzić zasięg, zadeklaruj "list1" jako globalny.
Gorąco polecam przeczytać this, mimo że na końcu jest literówka.
- 1. Co to jest transakcja globalna?
- 2. Co to jest wyrażenie w języku Python?
- 3. Co to jest "_csv" w języku Python?
- 4. Co to jest "\ 00" w języku Python?
- 5. Co to jest ".. ::." w języku C#?
- 6. Co to jest "String ..." w języku Java?
- 7. Co to jest void * w języku C#?
- 8. W języku PHP, co to jest Tick?
- 9. Co to jest dosłownie w języku Java?
- 10. Co to jest mnemonik w języku Java?
- 11. Co to jest kodowanie w języku XML?
- 12. Co to jest "1ULL" w języku programowania
- 13. Co to jest "@_silgen_name" w języku Swift?
- 14. Python: Co to jest nagłówek?
- 15. Co to jest jajko Python?
- 16. Co to jest odpowiednik "gem" w python?
- 17. Co to jest odwrotnością date.toordinal() w python?
- 18. Co to jest & H14 i w języku VBScript?
- 19. python: NameError: globalna nazwa”...„nie jest zdefiniowana
- 20. Co to jest python dla BigDecimal Java?
- 21. Parallel Python: Co to jest callback?
- 22. Co to jest "wiązanie lambda" w Pythonie?
- 23. Zmienna globalna Klasy Python
- 24. Co to jest Shadowing?
- 25. Co to jest python równoważny PHP $ _SERVER?
- 26. Co to jest podklasa
- 27. Kod w języku Python. Czy to jest operator przecinka?
- 28. Co to jest global ::?
- 29. Co to jest @. w Perlu?
- 30. Co to jest {} + {} w JavaScript?
tylko uwaga, 2.4 to stara wersja Pythona, aktualne odniesienie dla [wersja Pythona 2.X jest tutaj] (http://docs.python.org/2/reference/simple_stmts.html#global) –
Python 3 zawiera nową instrukcję 'nonlocal' oraz' global', zobacz też. –
@TahaJahangir - To dobra uwaga. Dodałem też trochę blurb na "nielokalnym" w mojej odpowiedzi z powodu twojego komentarza. Dzięki! – mgilson