当前位置: 首页 > news >正文

locals()和globals()如何控制Python变量的范围

Python 编程中,变量的作用域(scope)非常重要,因为决定了变量在程序中的可访问性和生命周期。对于一些高级用法,常常会遇到 locals() 和 globals() 这两个函数,可以帮助控制和查询变量的作用域,尤其是在动态代码执行和调试过程中。那么,locals() 和 globals() 是如何工作的呢?它们分别有什么作用?

 

1.作用域是什么?

在 Python 中,作用域指的是变量和函数可以访问的区域。Python 中有四种常见的作用域,它们分别是:

  • 局部作用域(Local scope):在函数或代码块内部定义的变量。

  • 封闭作用域(Enclosing scope):位于嵌套函数外部但又包含在内部函数中的作用域。

  • 全局作用域(Global scope):在模块层面定义的变量。

  • 内置作用域(Built-in scope):Python 内置函数和模块的作用域。

locals() 和 globals() 这两个函数帮助我们访问和操控这些作用域中的变量。

 

2.globals() 函数

globals() 函数返回一个字典,表示当前模块的全局符号表。简单来说,它提供了一个可以访问全局变量和函数的字典。使用 globals(),我们可以动态地查询、修改或添加全局变量。

示例:使用 globals() 查询和修改全局变量

x = 10  # 全局变量def test_globals():print(globals())  # 打印当前的全局字典test_globals()

输出:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class 'runpy._RunModuleContext'>, ... , 'x': 10}        从输出中可以看到,字典中包含了全局变量 x,还包括其他全局信息(如模块名称等)。  

 

修改全局变量:

x = 10  # 全局变量def test_globals():globals()['x'] = 20print(x)  # 输出: 20test_globals()

可以使用 globals() 来修改全局变量。通过将字典中的键(变量名)设置为新值,我们就成功地修改了全局变量。  

 

3.locals() 函数

locals() 函数返回一个字典,表示当前局部符号表。与 globals() 类似,locals() 允许我们访问和修改局部变量。在函数内部使用时,它返回当前函数的局部变量字典。

示例:使用 locals() 查询局部变量

def test_globals():a = 5b = 10print(locals())test_globals()

输出: {'a': 5, 'b': 10}       我们看到 locals() 返回的是当前函数的局部变量字典,包含了 a 和 b。

 

修改局部变量:

注意,虽然 locals() 可以用来查询局部变量,但直接通过它修改局部变量并不总是有效。因为 locals() 返回的是对局部变量的一个“视图”,而不是直接的可修改对象。

def test_locals():a = 5locals()['a'] = 10print(a)  # 输出: 5test_locals()

直接通过 locals() 修改变量并没有成功更新 a 的值。  

 

4.locals() 与 globals() 的区别

作用域

  • globals() 操作的是全局符号表,可以访问和修改全局变量。

  • locals() 操作的是局部符号表,通常用于查询局部变量。

修改行为

  • globals() 中的变量可以直接通过字典修改。

  • locals() 中的变量修改受限,在某些情况下不能直接通过 locals() 修改局部变量。

使用场景

  • globals() 用于需要动态操作全局变量的场景,比如在调试时修改全局变量。

  • locals() 更适合在函数内部使用,尤其是在调试时查看局部变量的值。

 

5.应用示例:动态创建变量

有时候可能需要在运行时动态创建变量或修改变量的值,这时就可以利用 globals() 或 locals() 来实现。

def dynamic_variable(name, value):globals()[name] = value  # 动态创建全局变量dynamic_variable('new_var', 100)
print(new_var)  # 输出: 100

这个例子演示了如何通过 globals() 动态创建全局变量。  

 

http://www.sczhlp.com/news/5979/

相关文章:

  • SpringBoot项目拆分构建jar包,减少更新体积 - Commissar
  • 说说
  • phpstorm+xdebug3
  • 滑动窗口解决求取字符串中最长不重复子串的长度
  • 美颜sdk中关于美型实现的技术细节方案
  • 高斯混合层次模型实现降维与聚类统一
  • Coze开源了!意味着什么?
  • EBS系统入账的错误码集合
  • 【程序员必备知识】Alpha、Beta、RC、Release版本的区别
  • C# Avalonia 08 - FontChooser
  • flutter 起步 - ---空白--
  • Redis使用命令启动怎么设置systemctl管理
  • java 使用 Log4j2 写日志 实现每小时滚动日志并按天分目录存储
  • canvas之修改Base64图片中不透明部分的颜色
  • 如何通过Python SDK新建一个DashVector Client
  • 5.输出正整数二进制1的个数 - hml
  • threejs之将张纹理图片组成材质组
  • PointCLIP
  • 样式3
  • lag功能测试
  • 甘特图关键路径怎么找?一文搞懂它对项目管理的决定性作用!
  • 使用Jumpserver 作业中心批量安装 Zabbix-agent
  • 用大白话讲透 PS 钢笔工具和贝塞尔曲线
  • 样式2
  • 将csv数据导入SQLite
  • C++11 原始字符串字面量(Raw String Literal)
  • 8.5
  • 学习笔记:五种基础排序C语言实现
  • 4.打印空心菱形 - hml
  • 记一次edu渗透之从任意文件访问漏洞到后门植入