Python全局命名空间值

时间:2018-04-17 14:58:06

标签: python scope namespaces

我只是好奇,我刚刚了解到解释器用来引用对象的Python内置,全局和本地命名空间基本上是一个Python字典。

我很好奇为什么在调用global()函数时,字典会在字符串中打印变量对象,但是定义的函数中的对象是指硬件内存地址?

例如 -

这个脚本:

print("Inital global namespace:")
print(globals())

my_var = "This is a variable."

print("Updated global namespace:")
print(globals())

def my_func():
        my_var = "Is this scope nested?"

print("Updated global namespace:")
print(globals())

输出:

Inital global namespace:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a483208>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'global_check', '__cached__': None}
Updated global namespace:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a483208>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'global_check', '__cached__': None, 'my_var': 'This is a variable.'}
Updated global namespace:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a483208>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'global_check', '__cached__': None, 'my_var': 'This is a variable.', 'my_func': <function my_func at 0x10a40ce18>}

'my_var': 'This is a variable.', 'my_func': <function my_func at 0x10a40ce18>

我理解有些人可能认为这些事情并不重要,但如果我想看到函数的对象,我甚至可以做这样的事情吗?这个问题有意义吗?

2 个答案:

答案 0 :(得分:0)

使用global my_var 然后,您可以在本地名称空间中分配全局变量

答案 1 :(得分:0)

在代码中键入my_var时,Python需要知道它代表什么。首先,它检入locals,如果找不到引用,则检查globals。现在,Python可以在您'string' == my_var时评估您的代码。类似地,当您在代码中编写函数名称时,Python需要知道它代表什么。由于函数的输出可以根据输入进行更改,因此Python无法存储像字符串这样的简单值来表示globals中的函数。相反,它存储内存引用,以便在您键入my_func()时,它可以转到该内存存储并使用该函数来计算输出。