2015-06-12 2 views
0

Я только что обнаружил это странное поведение в области видимости как Python 2, так и 3. Когда я добавляю поздний импорт для подмодуля, основной импорт модуля toplevel перестает работать. Жизнеспособное пример:странное поведение позднего импорта и области видимости

import os 


def start(): 
    import sys 
    print('in modules?', 'os' in sys.modules) 
    print('in globals?', 'os' in globals()) 
    print('in locals?', 'os' in locals()) 
    print('os =', os) 

    import os.path 
    os.path.exists('useless statement') 


start() 

Выход будет:

in modules? True 
in globals? True 
in locals? False 
Traceback (most recent call last): 
    File "test.py", line 15, in <module> 
    start() 
    File "test.py", line 9, in start 
    print('os =', os) 
UnboundLocalError: local variable 'os' referenced before assignment 

Любые идеи?

+0

По той же причине, которую вы когда-либо получали, 'UnboundLocalError' -' import os.path' присваивает 'os' так же, как' os = 1'. И почему ваш импорт не находится в верхней части сценария? – jonrsharpe

+0

@ jonrsharpe казалось странным, что 'os' из глобальной области не используется повторно * до того, как оно переопределено в локальной области. Кроме того, мой импорт импортирует библиотеки, которые можно безопасно импортировать только после форкирования. –

+1

Так оно всегда работает; Python проверяет * последующие * назначения в области, чтобы гарантировать, что одно и то же имя не будет использоваться для двух разных вещей в одной области. – jonrsharpe

ответ

1

Это ничего особенного в операторах импорта. Это то, как область обзора работает на Python. Если вы назначаете значение метке, оно является локальным для области, если явно не определено глобальное.

Попробуйте этот код -

a = 2 

def start(): 
    print a 

    a = 3 

start() 

Это также терпит неудачу с UnboundLocalError как код, потому что оператор a = 3 делает ярлык a местных функционировать start.