在这个内容中,我们整理了关于Python将字符串常量转换为变量的方法的知识点汇总。有需要的朋友可以学习一下。
前几天我们Python猫交流学习群的同学M问了一个问题。这个问题挺有意思的。经过初步讨论,我们认为它无解。
不过我觉得还是有价值的,应该继续思考怎么解决,所以我在私人知识星球上记录了下来。
没想到,第二天就有两个同学相继给出了解决方案!
于是,群里出现了一轮热烈的技术交流。
本文对相关内容的要点进行了梳理,然后引申到进一步的学习话题,希望对你有所帮助。
1.如何动态生成变量名?
m的问题如下:
不好意思,各位。请问我一个问题。已知list=['A ',' B ',' C ',' D'],如何得到以list中元素命名的新list A=[],B=[],C=[],D=[]?
可以理解,这个问题的意思是字符串内容作为其他对象的变量名。
列表中的元素是字符串,其中' a'-'d '是常量,在所需的结果中,A-D是变量。
如果您强制将常数直接用作变量,它将报告一个错误:
A'=[]
.语法错误:不能赋值给文本
错误报告中的Literal是指literal quantity,这是计算机科学中的一个常用概念,用于表示源代码中的固定值。比如整数、浮点数、字符串等基本类型都是文字量。
字面量是指一个量本身,可以理解为一个原子实体。当然不能再分配了。
所以提取出来的字符串的内容不能直接作为变量名,需要另辟蹊径。
新手可能会想,list[0]=[]可以吗?当然不是,因为没有A,那么A=list[0]后面跟A=[]呢?那也不行,因为这里的A是你凭空定义的,不是从现有条件中产生的。
当时小组里只有两三个同学参与讨论,我们也没有想到解决的办法。不过,我觉得这个话题很有意思,值得深思。
因为,如果能解决这个问题,就意味着无需预定义就能动态生成变量名,既能减少变量命名的麻烦,又能实现自动编码!
想象未来。人工智能在写代码的时候,如果能根据已知的条件动态生成变量名,那么写代码的过程岂不是顺畅很多?(据说现在人工智能可以写代码了。不知道它取变量名的时候用的什么方法?)
2、办法总是有的
最近,有几个广告客户混进了学习小组。为此我决定提高考试的门槛,比如用群里的题来做一个考核。
没想到,第一个被考核的同学Q几乎不假思索地说出了一个解决上述问题的想法。偏偏这么巧,几乎在同一时间,群里的J同学给出了另一种解决方案(他没有看到群里的讨论,但是看到了知识星球的记录,所以知道了这个问题)。
也就是说,前一天晚上认为没有解决的问题,第二天得到了两种不同的解决方案!
那么,他们的答案是什么?
# J的回答
list1=['A ',' B ',' C ',' D']
对于列表1中的I:
globals()[i]=[]
A
[]
这种方法通过修改全局名称空间巧妙地“定义”了新的变量。globals()方法拿出一个字典,字符串‘a’是其中一个键值,它只是全局命名空间中的一个变量,从而实现了常量到变量的转换。
在数据结构层面,空list []绑定到其字符串键值作为值,而在应用层面,绑定到变量名作为变量内容。
看到这个回答,我突然想起来了。上个月转载了一篇文章《Python 动态赋值的陷阱》,讲的是动态赋值变量的问题!我好像只关注了globals()和locals()用法的区别,并没有真正把握它们原本的用途。
同学J说,就是看了那篇文章才学会这个方法的。那很有趣。我分享了自己的知识,然后被J同学吸收掌握。最后反馈过来解决了我的问题。
真切感受到知识分享的魅力:知识在流动中获得生命,在碰撞中闪耀。
同时,我也真正明白了一个互助学习小组的好处:让别人受益的人也会让自己受益,互相帮助的人会共同进步。
3、动态执行代码的方法
一群新学生q给出了不同的答案:
# Q同学的回答
list1=['A ',' B ',' C ',' D']
对于列表1中的I:
exec(f“{ I }=[]')
A
[]
他的写作方法使用了Python 3.6引入的f-strings特性。其实在更低的版本中,也是可以实现的。只需要保证exec()方法收到的参数是包含变量I的字符串,比如这样写:
#以下代码可以替换上面示例的第4行
exec(i '=[]')
#或:
exec('{}=[]')。格式(一))
#或:
执行(')。join([i,'=[]']))
这几种写法的区别只是字符串拼接方法的区别。如何拼接琴弦以及不同方法的区别请参考《详解Python拼接字符串的七种方式》。
这个答案的核心在于exec()方法,这个方法是内置的,用于执行存储在字符串或文件中的代码段。
其基本用法如下:
exec('x=1 2 ')
x
3
#执行代码片段
s=' ' '
x=10
y=20
总和=x y
打印(总和)
'''
执行人员
30
看完了exec()的用法,我们再回来看看同学q的回答,我从for- loop中取出的是一个字符串,拼接后的字符串经过exec()处理,得到动态写代码的效果。
也就是说,因为字符串常量的内容是作为有效代码执行的,所以其中的' A'-'D '元素有了新的身份,变成了最终的A-D变量名。
这个方法看起来很简单,但是因为exec()方法实在是太不常见了,直到Q提出来我们才醒悟。
注意:在Python3中,exec()是内置方法;在Python2中,exec是一个语句,另外还有一个execfile()方法。当这两种方法结合在一起时,它就变成了Python3中的exec()方法。本文使用Python3。
4、总结
把原问题抽象一下,其实是问“如何使用字符串内容作为其他对象的变量名”,再进一步,就是3354“如何把常量转换成变量”。
用直接赋值的静态方法是行不通的。
两位同学提出的方法是间接动态法:一种是动态赋值变量,通过修改命名空间植入变量;一种是动态执行代码,可以说是通过“后门”,插入变量。
这两种方法的目的是一样的。不管是白猫还是黑猫,都是抓老鼠的。
这两种方法已经给我们带来了宝贵的启示。与此同时,因为他们,群里的朋友们也在分歧地讨论着一些相关的话题。比如同学S提出了另一种修改命名空间中变量的方法,同学L提到了eval()的含义,eval()和exec()的区别,我发现了为什么要慎用eval()。同学C和H提到了eval()
虽然有些话题在群聊中无法充分展开,但是这些话题的延伸知识极大的丰富了本文开头的问题。这个小问题牵连了两大知识体系。
最后,真的要感谢这群热爱学习的优秀同志们!除了文中提到的,也有同学做出了积极的贡献,大家都很帮忙!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。