我只是好奇,我刚刚了解到解释器用来引用对象的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>
我理解有些人可能认为这些事情并不重要,但如果我想看到函数的对象,我甚至可以做这样的事情吗?这个问题有意义吗?
答案 0 :(得分:0)
使用global my_var
然后,您可以在本地名称空间中分配全局变量
答案 1 :(得分:0)
在代码中键入my_var
时,Python需要知道它代表什么。首先,它检入locals
,如果找不到引用,则检查globals
。现在,Python可以在您'string' == my_var
时评估您的代码。类似地,当您在代码中编写函数名称时,Python需要知道它代表什么。由于函数的输出可以根据输入进行更改,因此Python无法存储像字符串这样的简单值来表示globals
中的函数。相反,它存储内存引用,以便在您键入my_func()
时,它可以转到该内存存储并使用该函数来计算输出。