Python3 globals() 和 locals() 内容

2023-12-19

在我的Python3学习中,在尝试globals()和locals()时,我做了一个非常基本的、独立的Python程序并收到了结果为此我请求专家解释.

然后,我在我的 Python 程序(任何)中执行了相同的 2 个函数,并在我的程序中收到了许多(所有?)值的列表,无论它是声明为本地的还是全局的还是非的。

简单解释

globals()指当前模块的属性字典。locals()指的是函数/代码片段中的当前局部变量。

设置一个变量将only永远改变locals()。 (除非你告诉 python 否则使用global or nonlocal关键词。)

这是一个例子

默认情况下,模块范围的全局变量与局部变量具有相同的字典:

>>> globals() is locals()
True

由于在这种情况下全局变量是局部变量,因此修改局部变量也会修改全局变量。

如果您创建一个函数并查看其中的局部变量,您会发现局部变量会有所不同

>>> def test():
...    print("globals is locals:", globals() is locals())
...    print("globals:", globals())
...    print("locals:", locals())
>>> test()
globals is locals: False
globals: {'__name__': '__main__', ...}
locals: {}

当您更改函数局部变量时,局部变量将自动更新

>>> def test2():
...     print("locals 1:", locals())
...     x = 1
...     print("locals 2:", locals())
>>> test2()
locals 1: {}
locals 2: {'x': 1}

创建新类时会发生类似的情况

>>> class Test:
...     print("locals:", locals())
locals: {'__module__': '__main__', '__qualname__': 'Test'}

更深入的解释

如果您想知道为什么全局变量和局部变量是这样的,让我们看看 Python 底层发生了什么。

一些基础工作

所有 python 代码都会传递相当于eval or exec在某个时刻发挥作用。这些函数接受三个参数:source, globals(默认为当前全局变量)和locals(默认为当前本地人)。

功能globals() and locals()将返回已传递到的任何内容eval or exec函数如上所示。

Python Shell 有什么作用?

如果你这样做

>>> print(globals())

REPL 将在内部做一些类似的事情

# This variable stores your globals.
_my_main_module = {}

def exec_some_line(line):
    return eval(line, globals=_my_main_module, locals=_my_main_module)

# ...

exec_some_line("print(globals())")

正如你所看到的,Python Shell 会在某个时刻设置globals and locals到同一个字典。

函数执行

在内部,函数执行本质上会做三件事:

  1. 解析传递给函数的参数并将它们添加到局部变量中。
  2. 执行函数的代码
  3. 返回其结果。

这是一个伪算法:

def __call__(*args, **kwargs):
    local_variables = parse_signature_with_args(args, kwargs)
    exec(function_source, function_globals, local_variables)
    return function_result

创建新类

当使用类语句时,所有缩进的代码将被单独执行。

  1. 创建一个新字典,它将充当locals()
  2. 您的代码是与所述当地人一起执行的。
  3. 该类是通过局部变量创建的

如果执行这段代码:

class Test:
   a = 5

大约会发生这样的情况:

 # 1. A new dictionary is created
 _dict = type.__prepare__()
 _dict["__module__"] = __name__
 _dict["__qualname__"] = "Test"

 # 2. Execute the code
 exec("a = 5", globals=globals(), locals=_dict)

 # 3. A class is created
 Test = type("Test", (), _dict)

这如何映射到模块导入

如果导入模块,则会启动复杂的导入机制。这是一个简化的概述:

  1. 解释器将查看模块是否已导入。
  2. 解释器将找到该文件。
  3. 然后读取并解析文件
  4. 创建了一个模块对象。
  5. python 脚本被执行,其全局变量和局部变量将被设置为新模块的__dict__属性。
  6. 返回模块对象。

它的工作原理是这样的:

import sys
from types import ModuleType
def __import__(name):
    # 1. See if module is already imported
    if name in sys.modules:
       return sys.modules[name]

    # 2. Find file.
    filename = find_out_path_to_file(name)

    # 3. Read and parse file
    with open(filename) as f:
      script = f.read()

    # 4. Create the new module
    module = ModuleType(name)

    # 5. Execute the code of the module.
    exec(script, globals=module.__dict__, locals=module.__dict__)

    # 6. Return the new module.
    return module
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 globals() 和 locals() 内容 的相关文章

  • 查找 with: 块中定义的函数

    这是一些代码理查德 琼斯的博客 http www mechanicalcat net richard log Python Something I m working on 3 with gui vertical text gui labe
  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们

随机推荐

  • Django中的send_mail,在shell中工作,在本地工作,不在视图中

    我什至不知道如何调试这个 我在 Django 的一个视图中使用 send mail 在本地使用该应用程序时 使用与我在生产中使用的相同的 SMTP 设置 它可以正常工作 并且在生产中的 shell 中也可以正常工作 同样 使用相同的设置 但
  • 当标题拆分为两行时修复plotly ggplotly() 标题重叠图

    在下面的示例中 标题的第二行与情节略有重叠 有没有办法通过增加标题和情节之间的间距来解决这个问题 library ggplot2 library plotly library magrittr p1 lt ggplot iris aes x
  • 如何使用 $.ajax(jQuery 或 Zepto)发布对象数组

    我想在 Zepto 或 Jquery 中使用 ajax 发布一组对象 两者都表现出相同的奇怪错误 但我找不到我做错了什么 当使用像 RestEasy 这样的测试客户端发送数据时 数据会保存到服务器 并且我可以看到请求在浏览器的网络面板中被破
  • 使用 Tor 运行 Puppeteer

    我安装了 Tor Expert Bundle 并且想使用 Puppeteer 运行它 I try const browser await puppeteer launch headless false args proxy server s
  • 更新后 Fabric 崩溃:[Fabric isCrashlyticsCollectionEnabled]:无法识别的选择器发送到类 0x10c0bb918

    今天 pod 更新后 Fabric 崩溃了 面料1 9 0 Fabric isCrashlyticsCollectionEnabled unrecognized selector sent to class 0x10c0bb918 崩溃线
  • Linux系统调用

    我能够获得系统调用的执行及其在内核中的处理 但我还不清楚一些事情 进入 swi 例程后 内核保存 用户模式寄存器在堆栈上 问题是 是谁的堆栈 因为 swi 处理和相应的系统调用例程需要堆栈帧来工作 如果是内核自己的堆栈 那么从哪里分配堆栈
  • 为什么数据流步骤无法启动?

    我有一个线性三步数据流管道 由于某种原因 最后一步开始 但前面的两个步骤挂起Not started在我放弃并终止这份工作之前很长一段时间 我不确定是什么导致了这个问题 因为同样的管道过去曾成功运行过 而且我很惊讶它没有在日志中显示任何阻止前
  • 更改成员资格连接字符串

    我是 ASP NET 成员资格新手 我需要帮助以编程方式更改其连接字符串 到目前为止我尝试过的是 我创建了一个类项目名称 Sample 作为命名空间 并扩展了System Web Security SqlMembershipProvider
  • C++中接口类和实现类的并行继承

    我正在尝试以与 Java 接口类似的方式使用 C 抽象基类 假设我们有以下仅具有纯虚函数的接口类 class Shape virtual double area 0 class Square public Shape virtual voi
  • 最简单的反向代理[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一种方法来简单地在本地设置连接到远程站点的代理 我不想在系统中正确安装任何东西 如果我可以使用单个命令行调用来调用它 而不是使用单个配置文件
  • 选择一个数据框中与另一数据框中部分匹配的行

    我希望在一个数据框中选择行 data 1 部分匹配第二个数据帧中的行 keep these 得到desired result 我在这里发现了几个基于一列匹配的问题 但我想在三列上匹配 STATE COUNTY and CITY 到目前为止
  • 在 Eclipse-Java EE 上,如何更改树视图上选定元素的颜色设置?

    我最近在 Eclipse Java EE Luna 上切换到深色主题 甚至尝试了其他深色主题 例如月出 但我总是最终不得不调整一些设置以便能够阅读内容 顺便说一下 我必须每次重新启动 Eclipse 时都会重新设置 我希望他们尽快解决该问题
  • 访问剪贴板的第 N 项

    有没有办法从剪贴板中检索多个项目 我正在使用这样的东西 Dim clipboard As MSForms DataObject Dim str1 As String Dim str2 As String Set clipboard New
  • MPI中如何知道进程正在哪个核心上运行?

    我目前正在开发一个项目 我需要知道 MPI 中当前运行进程的处理器的 coreid MPI中有一个函数叫做MPI Get processor name char name int resultlen 这仅给出进程正在运行的节点的名称 我想知
  • 如何清除v2谷歌地图中的所有标记?

    我需要清除 v2 谷歌地图中的所有标记 再次需要添加一些标记 如果有人知道答案 请分享您的想法 您可以使用googleMap clear https developer android com reference com google an
  • 如何在unix中仅替换>和<之间的一个换行符

    假设我有一条文字 this n is gt n lt 我想用 none 替换换行符 这将导致 this n is gt lt 如何实现这一目标 我尝试使用以下内容 echo this n is gt n lt sed e s gt n g
  • 选项卡栏图标选定的图像

    如何自定义标签栏上选定的图像 图标 这可能吗 请指教 谢谢 无需添加任何子视图即可实现 在定义选项卡栏的类中设置 tabBarItem 至 gt gt UITabBarItem tabBarItem1 self tabBar tabBar
  • 与逻辑语句匹配的 Rcpp 矩阵的子集

    在 R 中 如果我们有一个数据矩阵 比如一个 100 x 10 矩阵 X 以及一个具有可能值 0 1 2 3 的 100 元素向量 t 我们可以使用简单的方法轻松找到 X 的子矩阵 y句法 y X t 1 但是 问题是 我如何使用 Rcpp
  • “d3.translateExtent”坐标如何工作?

    jsfiddle演示 https jsfiddle net sarathsaleem 76t03kbu 我正在尝试向圆圈添加拖动并尝试应用translateExtent 那么如何将拖动边界限制在矩形范围内呢 var height 500 v
  • Python3 globals() 和 locals() 内容

    在我的Python3学习中 在尝试globals 和locals 时 我做了一个非常基本的 独立的Python程序并收到了结果为此我请求专家解释 然后 我在我的 Python 程序 任何 中执行了相同的 2 个函数 并在我的程序中收到了许多