Nie pytam o reguły zakresu Pythona; Ogólnie rozumiem, jak działa określanie zakresu w Pythonie dla pętli. Moje pytanie brzmi, dlaczego decyzje projektowe były podejmowane w ten sposób. Na przykład (gra słów nie przeznaczona):
for foo in xrange(10):
bar = 2
print(foo, bar)
Powyższe wydrukuje (9,2).
Wydaje mi się to dziwne: „foo” tak naprawdę kontroluje pętlę, a „bar” został zdefiniowany wewnątrz pętli. Rozumiem, dlaczego może być konieczne, aby „bar” był dostępny poza pętlą (w przeciwnym razie pętle miałyby bardzo ograniczoną funkcjonalność). Nie rozumiem, dlaczego zmienna sterująca musi pozostać w zakresie po wyjściu pętli. Z mojego doświadczenia wynika, że po prostu zaśmieca to globalną przestrzeń nazw i utrudnia wyśledzenie błędów, które zostałyby wyłapane przez tłumaczy w innych językach.
for
pętla zaśmiecała Twoją globalną przestrzeń nazw, zawiń ją w funkcję. Mnóstwo zamknięć!Odpowiedzi:
Najbardziej prawdopodobną odpowiedzią jest to, że po prostu utrzymuje prostą gramatykę, nie jest przeszkodą do przyjęcia, a wielu z nich jest zadowolonych z braku konieczności ujednoznaczniania zakresu, do którego należy nazwa podczas przypisywania jej w konstrukcji pętli. Zmienne nie są zadeklarowane w zakresie, wynika to z położenia instrukcji przypisania.
global
Kluczowe istnieje tylko z tego powodu (aby zaznaczyć, że zadanie jest wykonywane w zakresie globalnym).Aktualizacja
Oto dobra dyskusja na ten temat: http://mail.python.org/pipermail/python-ideas/2008-October/002109.html
Krótko mówiąc, prawdopodobnie możesz winić za to społeczność Pythona: P
źródło
Python nie ma bloków, podobnie jak niektóre inne języki (takie jak C / C ++ lub Java). Dlatego jednostka określająca zakres w Pythonie jest funkcją.
źródło
for
pętle zakresu są naturalnym rozszerzeniem ogólnej zasady. W Pythonie musiałby to być przypadek specjalny i należy unikać przypadków specjalnych, chyba że mają one istotne zalety.Naprawdę przydatnym przypadkiem jest to, gdy używasz
enumerate
i chcesz na końcu uzyskać całkowitą liczbę:Czy to konieczne? Nie. Ale z pewnością jest to wygodne.
Kolejna rzecz, o której należy pamiętać: w Pythonie 2 wyciekają również zmienne w listach składanych:
Ale to samo nie dotyczy Pythona 3.
źródło
else
klauzuli, tj.else: print "I did something {0} times".format(count)
- zanim zniknie lokalny zakres (który nie istnieje w Pythonie)someiterator
jest pusty?else
w tym przypadku można by użyć klauzuli, ogólnie nie zadziała, ponieważ treść pętli mogłaby zostaćbreak
przedwcześnie.Jeśli masz w pętli instrukcję break (i chcesz później użyć wartości iteracji, na przykład w celu pobrania kopii zapasowej, zindeksowania czegoś lub nadania statusu), oszczędza ona jedną linię kodu i jedno przypisanie, więc jest wygoda.
źródło
Jednym z głównych czynników wpływających na Python jest ABC , język opracowany w Holandii do nauczania koncepcji programowania dla początkujących. Twórca Pythona, Guido van Rossum, przez kilka lat pracował nad ABC w latach 80. Nie wiem prawie nic o ABC, ale ponieważ jest przeznaczone dla początkujących, przypuszczam, że musi mieć ograniczoną liczbę zakresów, podobnie jak wczesne BASIC-y.
źródło
Na początek, gdyby zmienne były lokalne dla pętli, te pętle byłyby bezużyteczne w większości rzeczywistych programów.
W obecnej sytuacji:
plony
45
. Teraz zastanów się, jak działa przypisanie w Pythonie. Gdyby zmienne pętli były ściśle lokalne:daje
0
, ponieważtotal
wewnątrz pętli po przypisaniu nie jest ta sama zmienna, cototal
poza pętlą. Nie byłoby to optymalne ani oczekiwane zachowanie.źródło
total
ifoo
nadal miałby lokalne powiązania pętli w scenariuszu OP, a logika jest taka sama.