函数中的全局对象在globals()中不存在

时间:2018-05-05 12:24:46

标签: python-3.x scope global

为什么用" 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

对象&#39; k&#39;被定义为全局,为什么我不能使用它的功能? 我看到了以下主题,它应该是wokrs: Use of "global" keyword in Python

1 个答案:

答案 0 :(得分:1)

在调用函数之前,

k尚未定义。在调用k之前,func1的价值是多少?

将呼叫转移到func1以上,以便您尝试使用k,以便在尝试使用之前定义它。

这是一个很好的例子,说明为什么(ab)使用全局变量并不是一个好主意。最好直接从func1返回值,然后在调用站点使用它。这样就清楚了数据的来源,并且在定义数据之前不会意外地使用数据。