2015-07-19 13 views
7

Jestem początkującym Python i jestem z C/C++ tła. Używam Pythona 2.7.Python: Zmienne są nadal dostępne, jeśli zostały zdefiniowane w próbie lub jeśli?

Przeczytałem ten artykuł: A Beginner’s Guide to Python’s Namespaces, Scope Resolution, and the LEGB Rule, i myślę, że mam pewne zrozumienie tych technologii Pythona.

Dziś zdałem sobie sprawę, że mogę napisać kod Pythona takiego:

if condition_1: 
    var_x = some_value 
else: 
    var_x = another_value 
print var_x 

Oznacza to, var_x jest nadal dostępny nawet jest nie określić przed if. Ponieważ pochodzę z języka C/C++, jest to dla mnie czymś nowym, ponieważ w C/C++, var_x są zdefiniowane w zakresie dołączonym przez if i else, dlatego nie można uzyskać do niego dostępu, chyba że zdefiniujesz var_x przed if.

Próbowałem wyszukiwać odpowiedzi w Google, ale ponieważ wciąż nie znam się na Pythonie, nie wiem nawet, od czego zacząć i jakich słów kluczowych powinienem użyć.

Domyślam się, że w Pythonie if nie tworzy nowego zakresu. Wszystkie zmienne, które są nowo zdefiniowane w if, znajdują się w zakresie, w którym znajduje się if i dlatego zmienna jest nadal dostępna po if. Jeśli jednak w powyższym przykładzie var_x jest zdefiniowane tylko w if, ale nie w else, zostanie wyświetlone ostrzeżenie, że print var_x może odwoływać się do zmiennej, która nie może być zdefiniowana.

Mam zaufanie do mojego własnego zrozumienia. Jednak, może ktoś mi pomóc poprawić, jeśli gdzieś się mylę, lub dać mi link do dokumentu, który omawia o tym?

Dzięki.

+1

Masz rację. Zmienne zdefiniowane w blokach 'if' /' elif'/'else' są widoczne w zakresie zawierającym blok. – MattDMo

+1

Dotyczy to również pętli 'for' i' while', a także instrukcji 'with'. Zasadniczo wszystko oprócz funkcji i klas (nadal można uzyskać dostęp do zmiennych za pośrednictwem nazwy klasy: 'Cls.var'). –

+1

możesz przestać patrzeć na to, co jest i nie jest w zasięgu z 'locals()' i 'globals()' – NightShadeQueen

Odpowiedz

10

Domyślam się, że w Pythonie if nie tworzy nowego zakresu. Wszystkie zmienne, które są nowo zdefiniowane w if, znajdują się w zakresie, w którym rezydują i dlatego zmienna jest nadal dostępna po if.

To prawda. W języku Python, namespaces, które zasadniczo decydują o zakresach zmiennych, są tworzone tylko dla modułów i funkcji (w tym metod, w zasadzie dowolnych def). Tak więc wszystko, co dzieje się w funkcji (a nie w podfunkcji) jest umieszczane w tej samej przestrzeni nazw.

Ważne jest, aby wiedzieć, że samo istnienie zadania w ramach danej funkcji zastrzega sobie nazwę w lokalnej przestrzeni nazw. To sprawia, że ​​dla niektórych ciekawych sytuacjach:

def outer(): 
    x = 5 
    def inner(): 
     print(x) 
     # x = 10 
    inner() 
outer() 

w kodzie powyżej, z tą linią zakomentowanym kod wypisze 5 jak można oczekiwać. To dlatego, że inner będzie wyglądać w zewnętrznym zasięgu dla nazwy x. Jeśli dodać linię x = 10 choć nazwa x będzie lokalny do inner, więc wcześniej patrzeć do x będzie wyglądać w lokalnej przestrzeni nazw inner.Ale ponieważ nie zostało jeszcze przypisane, otrzymasz "zmienną lokalną" x ', o której mowa przed przypisaniem "UnboundLocalError ()"). Instrukcja nonlocal została dodana w Pythonie 3 w celu rozwiązania jednego problemu: sytuacji, w której chcesz zmodyfikować zewnętrzny zakres w ramach funkcji wewnętrznej.

Aby uzyskać więcej informacji o wyszukiwaniu nazw, zobacz this related question.

+0

Dzięki, i dobrze jest poznać sytuację, o której tu wspomniałeś .. Nigdy o tym nie wiedziałem! – yaobin

Powiązane problemy