Глобальный объект в функции не существует в globals () - PullRequest
0 голосов
/ 05 мая 2018

Почему объекты, обозначенные "k" и "p", не являются глобальными?

my_global = 5


def func1(n=5):

    global my_global, k, p
    k = 10
    p = 15
    return my_global + n + k + p


all_gobals = globals()

print(k in all_gobals)

print(func1())

Выход:

print(k in all_gobals )
NameError: name 'k' is not defined

globals () дает мне:

{'__name__': '__main__', '__doc__': None, '__package__': None,    '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f1649b48c88>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/pawel/PycharmProjects/test/exerc.py', '__cached__': None, 'random': <module 'random' from '/usr/lib/python3.6/random.py'>, 'itertools': <module 'itertools' (built-in)>, 'string': <module 'string' from '/usr/lib/python3.6/string.py'>, 'a': 20, 'is_perfect_number': <function is_perfect_number at 0x7f1649b7ae18>, 'is_palindrome': <function is_palindrome at 0x7f16497e31e0>, 'ask_for_help': <function ask_for_help at 0x7f16486a5bf8>, 'method': <function method at   0x7f16486a5c80>, 'my_global': 5, 'func1': <function func1 at 0x7f16486a5d08>,     'all_gobals': {...}}

Почему выполнение print (k) дает?:

NameError: name 'k' is not defined

Объект 'k' был определен как глобальный, почему я не могу использовать его вне функции? Я видел следующую тему, и она должна работать: Использование "глобального" ключевого слова в Python

1 Ответ

0 голосов
/ 05 мая 2018

k не определено, пока не будет вызвана функция. Каким будет значение k перед вызовом func1?

Переместите вызов на func1 выше вашей попытки использовать k, чтобы он был определен до того, как вы попытаетесь его использовать.

Это отличный пример того, почему (ab) использование глобалов не является хорошей идеей. Было бы намного лучше вернуть значение из func1 напрямую, а затем использовать его на сайте вызова. Таким образом, становится ясно, откуда поступают данные, и вы случайно не используете данные до их определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...