【发布时间】:2018-04-17 14:58:06
【问题描述】:
我只是好奇,我最近才知道解释器用来引用对象的 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>
我知道有些人可能认为这类事情并不重要,但如果我想查看函数的对象,我什至可以做这样的事情吗?这个问题有意义吗?
【问题讨论】:
-
函数作为引用存储在内存中。 python 中有不同的作用域,
globals()仅适用于全局作用域。类和函数中的所有内容都是本地范围。无法从该函数外部访问其局部变量,因为它们甚至在调用该函数之前都没有初始化。 -
"打印字符串中的变量对象但是定义的函数中的对象引用的是硬件内存地址" 这句话我没看懂。它打印每个变量的名称和值。如果您对输出中的
<function my_func at 0x10a40ce18>感到惊讶,我不得不问:else 应该如何打印函数? -
@Aran-Fey 我很惊讶它没有打印出像
my_var = "Is this scope nested?"这样的东西 -
因为这是一个局部变量。它不存在于全局范围内。
-
啊,好吧,这是有道理的 Aran-Fey。 @Jonathan R 也许我仍然遗漏了一些东西,但有什么理由说明为什么函数被引用为硬件地址而变量被引用为字符串?
标签: python scope namespaces