python的内置函数locals()和有意思的小探索

news/2025/2/24 1:47:55/文章来源:https://www.cnblogs.com/smartljy/p/18733197

python的内置函数locals()

deepseek输出内容

locals() 的作用

locals() 返回一个字典,表示当前作用域的局部变量(包括变量名和对应的值)。它的核心用途是动态访问或操作当前作用域内的变量。

典型场景示例

def example():x = 10y = "hello"# 返回当前函数内的局部变量字典print(locals())  # 输出:{'x': 10, 'y': 'hello'}example()

locals()globals() 的区别

函数 作用域 返回内容
locals() 当前局部作用域(如函数内) 局部变量的字典(在模块层调用时与 globals() 相同)
globals() 全局作用域(模块层) 全局变量的字典

示例对比

global_var = "global"def test():local_var = "local"print("局部作用域:", locals())   # {'local_var': 'local'}print("全局作用域:", globals())  # 包含 'global_var' 和其他全局变量test()

locals() 的注意事项

  1. 动态修改局部变量(谨慎使用):

    def modify_locals():x = 1locals()["x"] = 100  # 通常无效!因为解释器可能优化了局部变量访问print(x)  # 输出:1(未修改成功)modify_locals()
    

    直接修改变量值比操作 locals() 字典更可靠。

  2. 在模块层调用时

    # 在模块层(全局作用域)调用 locals() 等价于 globals()
    print(locals() is globals())  # 输出:True
    
  3. 在类或嵌套函数中

    class MyClass:def __init__(self):self.a = 5print(locals())  # 输出构造函数的局部变量(包括 self)obj = MyClass()  # 输出:{'self': <MyClass object at ...>, 'a': 5}
    

常见误用与替代方案

误以为 locals() 能直接创建变量

def create_var():locals()["new_var"] = 42  # 不会实际创建变量!print(new_var)  # 报错:NameError# 正确方式:直接赋值
def correct_create_var():new_var = 42print(new_var)  # 输出:42

调试时查看变量

locals() 可以快速输出当前作用域的所有变量,便于调试:

def debug_function():a = 10b = [1, 2, 3]print(locals())  # 输出:{'a': 10, 'b': [1, 2, 3]}

总结

  • locals() 是 Python 内置函数,用于获取当前局部作用域的变量字典。
  • 不要混淆 local(),Python 中没有此函数。
  • 主要用途是调试或动态分析代码中的变量,直接修改变量建议使用赋值语句。

有意思的小实验

可以看看这期视频:
小实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888645.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp+h5---进行混合开发

uniapp和h5进行混合开发,最近在接手开发微信小程序,在技术选型的时候,拟采用uniapp+h5进行混合开发。 想必为啥要使用uniapp开发,就不用多说了?就是为了进行跨平台开发。如果使用微信小程序的开发方式,开发出来的应用就只能在微信小程序使用,但是使用uniapp就可以多端开…

dokcer-compose方式部署 mongo集群

声明:本人在单台机器上部署的mongo机器, mongo版本为8.0, 这玩意居然部署了一天,终于搞好了, 希望对后面想要部署的人有帮助 先创建一个mongodb目录, 后续的配置,数据都存放在这个目录中: 1. 创建mongo-secrets目录,mkdir mongo-secrets 2. 创建keyfile文件, openssl…

两个终端小玩具:Yazi和elinks

1. 终端文件管理器yazi 可以很方便地查找文件,跳转,并且很容易看出文件 1.1 下载安装 参考官方地址:鸭子官方安装手册安装rust编译环境curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup update编译yazigit clone https://github.com/sxyazi/yazi.git c…

两个终端小玩具

1. 终端浏览器 1.1 m3w 1.2 elinks 2. 终端文件管理器yazi 可以很方便地查找文件,跳转,并且很容易看出文件 2.1 下载安装 参考官方地址:鸭子官方安装手册安装rust编译环境curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup update编译yazigit clone htt…

用大模型DeepSeek分析一篇小公司创业失败的文章,失败的原因有哪些?

第一步:把原文保存为Doc格式文档 原本我想直接让 DeepSeek 分析链接的文章,但是两次写提示词后让 DeepSeek 深度分析,都失败了,它说无法直接访问,所以就无法直接分析原文内容。但还是基于搜索的结果进行普遍原因分析。 于是就把原文直接保存为 Doc,上传到 DeepSeek 让它分…

Markdowm学习

标题 二级标题 三级标题 四级标题 五级标题 六级标题 (#*n+空格+标题内容+回车——n级标题 注:此方法最多为六级标题) 字体样式 Hello World (两边加**为粗体) Hello World (两边加*为斜体) Hello World (两边加***为粗体+斜体) Hello World (两边加~~为删除线) 引用h…

区块链模型原理入门学习2——细化模型

以上描述中,存在一些非生产情景的理想化设定。比如:1.没有设计谜题难度平衡 2.没有加入加密校验数字签证 3.没有设计个人钱包 4.广播问题【敬畏能量 敬畏自然】

upload-labs/Pass-12 白名单检测 - %00 截断 GET

save_path 为客户端向服务器端传递的额外信息,可能用此参数指定上传文件的保存目录将save_path 更改为../upload/test.php%00 filename=test.png,filename 的后缀名需要满足白名单 路径和文件名组合在一起会变成../upload/test.php%00test.png , 后缀名满足白名单那么文件就…

upload-labs/Pass-13 白名单检测 - %00 截断 POST

POST 数据包的路径在请求体中在请求体中添加文件名称test.php, 但是不能像GET请求的数据包一样直接添加%00 了,我们需要直接在hex 中将标记修改为00;同时记得把文件名修改为可以上传的后缀重放数据包即可成功绕过上传

upload-labs/Pass-14 Pass-15 图片码绕过

copy .\test.png/b+.\test.php/a kb.png /b:以二进制模式 读取文件 .\test.png /b:以二进制读取test.png /a:以 ASCII 文本模式 读取文件,遇到第一个 EOF(文件结束符,如 0x1A)时停止读取。 .\as.php /a:以 ASCII 文本模式 读取as.php +:表示合并操作,将多个文件内容拼…

upload-labs/Pass-07 黑名单检测 -空格绕过

代码中没有对文件左右两侧去除空格,在文件名后面添加空格不影响文件执行,因此可以绕过

upload-labs/Pass-06 黑名单检测 - 后缀大小写绕过

利用Windows对大小写不敏感的特性。代码中没有对文件大小写做归一,更改文件后缀名大小写可以绕过黑名单