ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
940970
maleon (17.08.2019 16:15 - 18.08.2019 12:29, просмотров: 545)
Знатокам Python, почему после "exec" нет доступа к переменной "b", хотя она есть в dir() и locals()? http://caxapa.ru/upload/files/509222d81aacc3adabce584b7d5cfa1c835b3d12/test_eval.zip
Код:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def check_test():
    print('*globals().keys() не меняется ->', *globals().keys())
    print('    До всего')
    print('locals() ->', locals())
    print('dir() ->', dir())
    print('    До "exec"')
    print('a = 5')
    a = 5
    print('locals() ->', locals())
    print('dir() ->', dir())
    exec('''
print('    Внутри "exec"')
print('b = 3')
b = 3
print('locals() ->', locals())
print('dir() ->', dir())
print('a ->', a)
print('locals()["b"] ->', locals()['b'])
print('b ->', b)
        ''')  # , globals(), locals()
    print('    После "exec"')
    print('locals() ->', locals())
    print('dir() ->', dir())
    print('a ->', a)
    print('locals()["b"] ->', locals()['b'])
    print(end='b -> ')
    try:
        print(b)
    except Exception as e:
        print(e)
    exec('''
print('    Внутри второго "exec"')
print('b ->', b)
        ''')
    print('    После второго "exec"')
    print(end='b -> ')
    try:
        print(b)
    except Exception as e:
        print(e)

if __name__ == '__main__':
    check_test()
На выходе:
*globals().keys() не меняется -> __name__ __doc__ __package__ __loader__ __spec__ __builtins__ __file__ check_test
    До всего
locals() -> {}
dir() -> []
    До "exec"
a = 5
locals() -> {'a': 5}
dir() -> ['a']
    Внутри "exec"
b = 3
locals() -> {'a': 5, 'b': 3}
dir() -> ['a', 'b']
a -> 5
locals()["b"] -> 3
b -> 3
    После "exec"
locals() -> {'a': 5, 'b': 3}
dir() -> ['a', 'b']
a -> 5
locals()["b"] -> 3
b -> name 'b' is not defined
    Внутри второго "exec"
b -> 3
    После второго "exec"
b -> name 'b' is not defined