2015-11-03 1 views
3

Как обмен сферы в питоне работе ?:Почему python не является строгим в отношении областей?

def test(): 
    if True: 
     a = 3 
    print a 

Этот вопрос был задан несколько способов, в несколько раз, но в чем причина, что питон не так строг областях? Тот же самый код в C++ даст ошибку:

error: 'a' was not declared in this scope 
+0

Потому что нет необходимости в декларации. Это WHERE вы назначаете имя, которое подсчитывается, по размеру, тогда как контент определяет его тип (который может поэтому меняться со временем ...) – Pynchia

+0

Значит, он просто ищет, где в иерархии он найдет значение? Значит, переменные не уничтожаются после выхода из области? – user1767754

+0

http://stackoverflow.com/q/291978/238978 –

ответ

2

Причина, лежащая в основе правил доступа к областям Python, является следствием выбора Python не иметь явных деклараций локальных переменных. Без таких заявлений, C++ - правила области стиля, где каждый вложенности создает новый контекст будет сделать следующую неудачу:

def test(): 
    if some_condition: 
     a = 3 
    else: 
     a = 5 
    # If the above nesting created a new scope, "a" would 
    # now be out of scope. 
    print a 

Это работает в C++, так как явные декларации предоставить вам выбор между написанием:

// doesn't work 
if (some_condition) { 
    int a = 3; 
} 
else { 
    int a = 5; 
} 
// "a" is out of scope 
std::cout << a ; 

и:

// works 
int a; 
if (some_condition) { 
    a = 3; 
} 
else { 
    a = 5; 
} 
printf("%d\n", a); 

Python, не имея явных деклараций для локальных переменных, необходимо расширить сферу в целом определения функции (и определение класса я n случай класса).

+0

Так почему же 'a' ограничивается областью действия? – juanchopanza

+0

@juanchopanza Поскольку функция, в отличие от обычного блока с отступом, создает свою собственную область.Было бы странно и опасно создавать глобальные переменные автоматически автоматически по всему месту. Кроме того, если /, где они нужны, то ** ** имеет возможность использовать декларацию 'global'. – user4815162342

+0

Потому что это типичный вариант использования. Если вам нужно написать глобальное, вы должны явно запросить его. Там * есть * языки, где по умолчанию используется глобальные переменные (JavaScript, Lua), но это часто является источником ошибок. –

2

В C++ каждый набор брекетов определяет новую область, но это не относится к Python и уровней отступа. В Python только функция и модуль определяют область; контрольных блоков, таких как if, нет.

+0

hmmm try/catch тогда также не облагается – user1767754

+2

Не вопрос почему? – juanchopanza

+0

Обратите внимание, что 'class' также определяет область. – user4815162342

Смежные вопросы