【问题标题】:Python Global Namespace valuesPython 全局命名空间值
【发布时间】: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() 仅适用于全局作用域。类和函数中的所有内容都是本地范围。无法从该函数外部访问其局部变量,因为它们甚至在调用该函数之前都没有初始化。
  • "打印字符串中的变量对象但是定义的函数中的对象引用的是硬件内存地址" 这句话我没看懂。它打印每个变量的名称和值。如果您对输出中的&lt;function my_func at 0x10a40ce18&gt; 感到惊讶,我不得不问:else 应该如何打印函数?
  • @Aran-Fey 我很惊讶它没有打印出像my_var = "Is this scope nested?"这样的东西
  • 因为这是一个局部变量。它不存在于全局范围内。
  • 啊,好吧,这是有道理的 Aran-Fey。 @Jonathan R 也许我仍然遗漏了一些东西,但有什么理由说明为什么函数被引用为硬件地址而变量被引用为字符串?

标签: python scope namespaces


【解决方案1】:

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

【讨论】:

  • 哦!所以这是因为函数的输出可以根据输入而改变,这正是我需要知道的,谢谢@bphi。
【解决方案2】:

使用global my_var 然后你可以在本地命名空间中分配你的全局变量

【讨论】:

  • 谢谢 Null,也许我的问题不够清楚。我想知道为什么函数在全局命名空间中有硬件地址引用,但变量打印在字符串中?
  • 在python中,函数也是变量,globals()返回所有全局变量的dict,名称为key
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2013-11-22
相关资源
最近更新 更多