最新要闻
- 【津云镜头】特警三支队、金街治安派出所做好爱警暖警工作
- 满满的回忆!赵雅芝吕良伟同台合唱《上海滩》 头条焦点
- 印度加入美国载人登月计划 被赞苏醒中的巨人:航天将远超俄罗斯
- 特斯拉天幕变全景烤炉 开车戴帽子冰袖 女子调侃自己变烤乳猪
- 这就是差距!AMD ROCm开发平台终于要支持RX 7900 XTX
- 蓉港高铁明天正式开行:成都10小时直达香港
- 收评:创业板指涨1.6% 复合集流体概念涨幅居前-焦点速讯
- 天热要注意!女子连吃两个超甜菠萝肝衰竭 医生称元凶可能是蜡样芽孢杆菌
- 上市公司回应给员工放暑假:放假情况属实 但个位数员工在岗不实
- 比盐粒还小的“LV”手提包卖出46.2万:用显微镜才能看清
- 从此告别毛巾了:芷雨加大洗脸巾13.9元200抽狂促
- 世界热讯:索尼第一方大作改编!电影《GT赛车:极速狂飙》官宣引进国内
- 今日讯!交易所协会再提积极服务低碳转型 绿色债券这三年发展有多快?
- 第一批实验室培育肉在美获准销售,人造肉市场发展风口何时来?
- 世界快报:流水线“造人”成真?科学家成功培养首个人类胚胎模型 全球哗然专家释疑
- 索尼称Xbox太有钱 能花50亿美元做3款独占《COD》
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
使用Python字符串访问与修改局部变量_每日热议
在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数中,那么就还有额外的成员变量(self)空间。那么,如果在实际操作中,想把这几种不同的变量空间做一个分离的话,有没有办法呢?
1.读取和修改局部变量
首先来看一下局部变量的读取,一般有locals()、vars()和sys._getframe(0).f_code.co_varnames这几种方法,另外有一种sys._getframe(0).f_locals的方法,其实等价于locals(),相关的实现代码如下:
x = 0 class Obj: def __init__(self,y): self.func(y) def func(y, z=1): m = 2 print (locals()) print (vars()) print (__import__("sys")._getframe(0).f_code.co_varnames) if __name__ == "__main__": Obj(2)
该代码的运行结果如下:
(资料图片)
{"self": <__main__.Obj object at 0x7f5cf5e74e50>, "y": 2, "z": 1, "m": 2}{"self": <__main__.Obj object at 0x7f5cf5e74e50>, "y": 2, "z": 1, "m": 2}("self", "y", "z", "m")
在vars方法不加具体变量名的时候,就是等价于locals方法,两者返回的结果都是字典格式。如果是一个类中的成员函数下执行locals或者vars,会附带一个__main__.Obj object的变量,相当于所有self的成员变量,其实也是局部变量的一部分。而如果使用co_varnames的方法,那么得到的就是所有局部变量的名称,我们也可以在例子中额外定义一个self的成员变量:
x = 0 class Obj: def __init__(self, y): self.p = 5 self.func(y) def func(self, y, z=1): m = 2 print(locals()) print(vars()) print(__import__("sys")._getframe(0).f_code.co_varnames) if __name__ == "__main__": Obj(2) # {"self": <__main__.Obj object at 0x7fe9aac0ce50>, "y": 2, "z": 1, "m": 2} # {"self": <__main__.Obj object at 0x7fe9aac0ce50>, "y": 2, "z": 1, "m": 2} # ("self", "y", "z", "m")
可以发现,所有的成员变量都被放在了self中。并且需要注意的是,全局变量x自始至终都没有在局部变量中出现。那么既然我们可以通过这种方式分离出局部变量,或者是局部变量的名称,那我们如何去调整或者修改这些局部变量呢?首先我们需要知道,locals()方法返回的变量是一个copy,也就是说即使修改了locals方法返回的结果,也不能真正的改变局部变量本身的值,这样描述可能有点抽象,我们直接看下这个案例:
x = 0 class Obj: def __init__(self,y): self.func(y) def func(self, y, z=1): m = 2 vars()["z"]=2 locals()["n"]=3 print (locals()) print (z) if __name__ == "__main__": Obj(2)
在这个案例中分别通过vars方法和locals方法去修改局部变量的值,最终的输出结果如下:
{"self": <__main__.Obj object at 0x7f74d9470e50>, "y": 2, "z": 1, "m": 2, "n": 3}1
首先要解释一下为什么这个案例中没有打印n这个变量,前面提到vars和locals的返回值都是真实变量的一个copy,因此我们不管是修改也好,新增也好,内容不会同步到变量空间中去,也就是说,此时的局部变量n还是处于一个没有定义的状态,只是在locals或者vars的字典中存在,此时打印只会报错NameError。而z的最终打印输出是1,这表明z的值确实没有受到对vars的变量修改的影响。那到底有没有办法可以通过字符串去修改局部变量呢(不同步到全局变量)?答案是有的,但是这个方案非常的hacky,请看如下示例:
import ctypes x = 0 class Obj: def __init__(self,y): self.func(y) def func(self, y, z=1): m = 2 __import__("sys")._getframe(0).f_locals.update({ "z": 2,"n": 3 }) ctypes.pythonapi.PyFrame_LocalsToFast( ctypes.py_object(__import__("sys")._getframe(0)), ctypes.c_int(0)) print (locals()) print (z) if __name__ == "__main__": Obj(2)
这个案例是使用了Cython的方案直接去修改了数据帧的内容,而这里所使用的f_locals其实本质上就是locals。经过一番运行,输出结果如下:
{"self": <__main__.Obj object at 0x7fea2e2a1e80>, "y": 2, "z": 2, "m": 2, "n": 3}2
此时局部变量z是被成功修改了的,但是在前面提到的,即使我们通过这种方法修改了局部变量的值,但是依然不能通过这个方案去创建一个新的局部变量,此时去执行print (n)的话,依然会有报错提示。
2.读取和修改全局变量
相比于修改局部变量,其实查看修改全局变量要显的更加容易。首先我们用一个示例演示一下如何查看所有的全局变量:
x = 0 class Obj: def __init__(self,y): self.func(y) def func(self, y, z=1): m = 2 print (globals()) if __name__ == "__main__": Obj(2)
获取局部变量的方式有很多,但是获取全局变量一般就是globals或者等价的f_globals。上述代码执行输出如下:
{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x7f202632ac40>, "__spec__": None, "__annotations__": {}, "__builtins__": , "__file__": "xxx.py", "__cached__": None, "x": 0, "Obj": }
用这种方法我们发现了全局变量x,而在同一个函数内的几个局部变量,就没有显示在globals的key中。而不同于locals变量的是,globals函数返回的是一个真实的数据,是可以直接修改,并且在全局生效的。
比如我们在函数内定义或者修改全局变量:
x = 0 class Obj: def __init__(self,y): self.func(y) def func(self, y, z=1): global m m = 2 globals()["x"]=3 if __name__ == "__main__": Obj(2) print(globals()["x"]) print(globals()["m"]) # 3 # 2
在这个例子中我们就可以发现,不仅仅是修改的x值生效了,新建的m也同步到了全局变量中,这样就可以比较容易的划分全局变量和局部变量再进行统一赋值或者修改。
3.读取和修改成员变量
在python中每一个定义的object都有一个隐藏属性__dict__,这是一个字典,其中包含了所有的成员变量名和成员变量值。在前一篇博客中,我们就介绍了通过__dict__去给类中的成员变量进行赋值,非常的方便。我们可以通过一个示例来看看__dict__中所包含的内容:
x = 0 class Obj: def __init__(self,y): self.m = 2 self.func(y) def func(self, y, z=1): print (self.__dict__)#学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441 if __name__ == "__main__": Obj(2) # {"m": 2}
从输出结果中我们就可以看到,__dict__输出的内容非常的纯净,就是所有的成员变量名和变量值。而成员变量虽然是一个对象的属性,但是其操作方式跟全局变量globals是非常接近的,不像locals一样只读,具体示例如下:
x = 0 class Obj: def __init__(self,y): self.m = 2 self.func(y) def func(self, y, z=1): self.m = 5 self.__dict__["n"] = 6 print (self.__dict__) print (self.m, self.n) if __name__ == "__main__": Obj(2) # {"m": 5, "n": 6} # 5 # 6
在这个案例中,我们修改了成员变量的值,也使用__dict__新建了一个成员变量的值,可以看到最终都有同步到变量空间中,这样就完成了成员变量的修改。
4.总结
Python本身是一门比较灵活便捷的编程语言,但是便捷往往有可能伴随着一些风险,比如exec和eval等内置函数的实现,有可能导致sandbox escaping的问题。而有时候我们又需要一些批量化的操作,比如批量化的创建或者修改局部、全局或者是成员变量,这样就需要我们首先要把所有的变量名存成字符串,在需要的时候再作为变量名去调用。
在这篇文章中,我们介绍了一系列非exec和eval的操作(并不是说没有风险,也引用了ctype和sys定义的数据帧),来查看和定义、修改所需的各种变量。
关键词:
使用Python字符串访问与修改局部变量_每日热议
热点在线丨狂收 3.2k star!百度开源压测工具,可模拟几十亿的并发场景,太强悍了!
【津云镜头】特警三支队、金街治安派出所做好爱警暖警工作
布局高端车载PHY芯片,加速推动高速以太网通信芯片国产化——访裕太微首席运营官李晓刚
科创板收盘播报:科创50指数涨0.37% 新股芯动联科较发行价涨75.21%
满满的回忆!赵雅芝吕良伟同台合唱《上海滩》 头条焦点
印度加入美国载人登月计划 被赞苏醒中的巨人:航天将远超俄罗斯
特斯拉天幕变全景烤炉 开车戴帽子冰袖 女子调侃自己变烤乳猪
这就是差距!AMD ROCm开发平台终于要支持RX 7900 XTX
蓉港高铁明天正式开行:成都10小时直达香港
收评:创业板指涨1.6% 复合集流体概念涨幅居前-焦点速讯
证监会公布第三批企业债注册批文 职责划转后核发募资超千亿元
天热要注意!女子连吃两个超甜菠萝肝衰竭 医生称元凶可能是蜡样芽孢杆菌
上市公司回应给员工放暑假:放假情况属实 但个位数员工在岗不实
比盐粒还小的“LV”手提包卖出46.2万:用显微镜才能看清
从此告别毛巾了:芷雨加大洗脸巾13.9元200抽狂促
世界热讯:索尼第一方大作改编!电影《GT赛车:极速狂飙》官宣引进国内
今日讯!交易所协会再提积极服务低碳转型 绿色债券这三年发展有多快?
「隐私计算黑客松」获奖代码全部开源!快去打卡~
当前资讯!干货|三个维度详解 Taier 本地调试原理和实践
通过 ChatGPT 提高你的创造力 焦点报道
天天微速讯:JetBrains系IDE使用Git很慢的问题
第一批实验室培育肉在美获准销售,人造肉市场发展风口何时来?
世界快报:流水线“造人”成真?科学家成功培养首个人类胚胎模型 全球哗然专家释疑
索尼称Xbox太有钱 能花50亿美元做3款独占《COD》
手握309亿利润却不分红 中芯国际:为股东长期利益考虑 滚动
大棕熊“下班”咣咣砸门急得直跳脚 绝不加班:网友直呼像极了打工人的我
盘点C#中感叹号"!"的作用_全球时讯
数码教程资讯:小米11青春版怎么设置24小时 全球聚看点
热热热!全国多地气温超40度 新能源车主如何经受“烤验”_环球头条
热文:炸串店老鼠啃食香肠被拍下 网友:主打一个明目张胆
315曝光假泰国香米公司被吊销:完全香精勾兑 和香米不沾边
何小鹏:和李斌、李想还在一个群里 但跟李斌聊得多些
上新了!小米平板6 Max首曝:12.4寸屏+10000mAh电池_环球关注
什么是 ChatGPT? 环球短讯
js中的解构赋值
Spring事件监听在业务使用中的优化
我国首个万吨级光伏制氢项目投产-环球今亮点
好作品应如实呈现时代的偏见吗?——《漫长的季节》中的女性角色塑造 焦点
【速看料】国产办公软件WPS出现服务故障 官微道歉:正在紧急排查修复
全球实时:红魔电竞平板官宣:首款骁龙8 Gen2+内置风扇平板
《博德之门3》反向跳票!不会为主机版质量向30帧妥协 全球快讯
你退了吗?网易暴雪国服游戏退款申请今天截止:过期视为自动放弃 全球快消息
男生长胖20斤被公司解约 官方回应:如举报会责令整改_当前短讯
每日播报!Linux 中重置数据库的 root 密码的技巧
海外视频直播源码技术视频直播间的搭建
BabylonJS教程_编程入门自学教程_菜鸟教程-免费教程分享|动态焦点
海康威视产品命名规则
焦点快看:记录一次项目数据采集分析-NEWC数据泄漏
微软只保证《使命召唤》停留三年 索尼官方回应
新资讯:携程正式宣布员工生孩后补贴5万元:每年1万 连领5年
超值优惠手慢无:真维斯Z+冰丝短裤29元、长裤/Polo衫39元
特斯拉充电中被临车女车主强行拔枪:哨兵模式拍个正着-焦点信息
你能坚持多久?小伙在没信号的原始森林隐居4年火了:中国最神秘部落揭秘_环球今热点
每日消息!特斯拉人形机器人将亮相上海:预计未来售价不超过15万元
IAM风险CTF挑战赛
PC网站如何实现微信扫码登录
【世界热闻】马价十倍说明了什么道理_马价十倍
【新视野】7月新规来了
我们该怎么帮助年轻人就业
2.5万元的Vision Pro问世 荣耀赵明:整个行业都应该感谢苹果_最新快讯
焦点资讯:帕萨特提车第二天就严重抖动 车主:车子像是仿佛在蹦
荣耀赵明:面对最强对手苹果竞争 荣耀整合核心能力突破
荣耀Magic V2即将发布 赵明:折叠屏将是未来最优解
贵州6人吃野生菌4人被送云南抢救:误食亚稀褶红菇、严重可致死
呼和浩特市:69处党政机关、企事业单位内部车场共享开放
一天吃透MySQL面试八股文 环球快资讯
央企的无奈:假央企何以屡禁不止?
每日快报!高温持续驻守华北黄淮等地 长江中下游降雨增强
游客自驾游开车压草场牧民损失数万 无视警示牌:官方回应
世界简讯:建全自主半导体产业链几乎不可能!ASML找强援:加速推进新一代光刻机
全球聚焦:频繁被黑!警惕抹黑清华的舆论倾向 网友支持:严惩造谣者
特斯拉Model 3一头扎进农田 只是因为捡一个瓶子 全球滚动
行政拘留能暂缓执行吗
【天天报资讯】险资:权益市场在底部区域 下半年看好科技和消费的投资价值
时代的眼泪!Kindle中国电子书店正式停运:这下真要盖泡面了-天天即时看
华为搞定6G赫兹技术验证:可实现10Gbps下行速率_世界速看
售价超28万!Caviar推出定制苹果Vision Pro:3斤18K黄金闪瞎眼 微资讯
栗新小学教师志愿服务队_关于栗新小学教师志愿服务队概略
天天通讯!读发布!设计与部署稳定的分布式系统(第2版)笔记16_握手和考验机
【环球新要闻】无糖可乐不能喝了?或含致癌物 厂商纷纷回应撇清关系
确保数字孪生水利管用好用_播资讯
小屏旗舰最后的荣光!华硕Zenfone 10图赏
国际饮料协会回应阿斯巴甜争议:系误导
双头男孩上下串联:被当畸形参观 死后还被盗尸解剖
无糖可乐或含致癌物?不能喝了?要不咱先把猪肉给戒了吧
全球热资讯!马云说阿里巴巴永远不会做快递!结果 还是真香
Epic喜+1:《纳赫鲁博王国地下城:混沌护符》!
开不了口周杰伦在线试听_开不了口周杰伦-世界观热点
今日看点:怒斥温网官方!安迪穆雷为自己鸣不平:我比阿尔卡拉斯伟大!
浙江省衢州市出现北斗智慧综合灯杆 实现全自动道路巡检
电影《封神第一部》妲己首次亮相 由新人演员娜然扮演
美团成功收购光年之外 收购价约为20.65亿人民币
市民称上海外滩夜景灯光太土 有一种浓浓的乡镇味道
科学家发现“孤雌生殖”的案例 哥斯达黎加一鳄鱼采用独特“繁殖”方式
国内首款抑郁症诊断机器人正式亮相 通过智能传输分析患者是否有抑郁症
全国首位视障播音硕士董丽娜毕业 其坚韧性格和不屈精神感动数万人
获取波场(Tron)钱包TRX、USDT余额和剩余带宽、能量 - 笔记 世界快播报
计算机专业学生暑假要去看这些经典书籍! 环球新视野
焦点播报:微服务架构必读篇 - 网关