1。如何动态生成变量名?问题如下:请问,请教一个问题,给定list=['A','B','C','D'],如何得到一个以listA=[中的元素命名的新列表],B=[],C=[],D=[]?简单理解,这道题的意思是将字符串内容作为其他对象的变量名。列表中的元素是字符串,其中'A'-'D'是常量,在请求的结果中,A-D是变量。如果强行把常量直接当作变量使用,会报错:>>>'A'=[]...SyntaxError:can'tassigntoliteral报错中的literal指的是字面值,这是计算机科学中常见的一个概念,用来表示源代码中的一个固定值。例如,整数、浮点数、字符串等基本类型都是字面量。字面量是指一个量本身,可以理解为一个原子实体,当然不能赋值。所以提取出来的字符串内容不能直接作为变量名,需要另找方法。有的初学者可能会想,list[0]=[]可以吗?当然不是,因为A没有出现。A=list[0]后跟A=[]怎么样?那也不行,因为这里的A是你凭空定义的,不是根据现有条件生成的。当时,我们没有想到解决办法。不过,我觉得这个话题很有意思,值得深思。因为,如果能解决这个问题,就意味着可以动态生成变量名而不是预先定义,这样既减少了变量命名的麻烦,又实现了自动编码!你可以想象未来。人工智能在写代码的时候,如果能根据已知条件动态生成变量名,写代码的过程岂不是顺畅很多?(据说现在人工智能可以写代码了,不知它是用什么方法获取变量名的?)2、方法总是有的>>>list1=['A','B','C','D']>>>foriinlist1:>>>globals()[i]=[]>>>A[]这个方法巧妙地“定义”了一个新的变量。globals()方法取出一个字典,字符串'A'是其中一个键值(key),而这个键值只是全局命名空间中的一个变量,实现了常量到变量的转换。在数据结构层面,空列表[]作为值绑定到它的字符串键,在应用层面,它作为变量内容绑定到变量名。看到这个回答,我突然想起来我好像只关注了globals()和locals()用法的区别,并没有真正掌握它们原来的用法。3、动态执行代码的方法>>>list1=['A','B','C','D']>>>foriinlist1:>>>exec(f"{i}=[]")>>>A[]使用Python3.6中引入的f-strings功能。其实低版本也可以实现。你只需要保证exec()方法接收到的参数中包含变量i的字符串就足够了,比如这样写:#下面的代码可以代替上面例子的第四行exec(i+"=[]")#或者:exec("{}=[]".format(i))#或者:exec(''.join([i,'=[]']))这些写法的区别只是字符串拼接方式的不同。核心在于exec()方法,该方法是内置的,用于执行存储在字符串或文件中的代码段。它的基本用法如下:>>>exec('x=1+2')>>>x3#执行代码段>>>s=""">>>x=10>>>y=20>>>sum=x+y>>>print(sum)>>>""">>>exec(s)30看完了exec()的用法,我们回过头来看Q的回答。for循环中取出的i是一个字符串,拼接后的字符串经过exec()处理,达到动态写代码的效果。也就是说,由于字符串常量的内容作为有效代码执行,其中的'A'-'D'元素获得了新的身份,成为最终的A-D变量名。这个方法看起来很简单,但是exec()这??个方法实在是太生僻了注意:在Python3中,exec()是内置方法;在Python2中,exec是一个语句(statement),还有一个execfile()方法,两者结合起来,就变成了Python3中的exec()方法。本文使用Python3。4.总结和提炼原题。它实际上问的是“如何将字符串内容用作其他对象的变量名”,更具体地说——“如何将常量转换为变量”。使用直接进行赋值的静态方法是行不通的。两种方法都是间接动态方法:一种是动态给变量赋值,通过修改命名空间插入变量;另一种是动态执行代码,可以说是通过“后门”的方式插入变量。两种方法的目的是一致的,不管是白猫还是黑猫,都抓住了老鼠。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
