共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
1、如何动静生成变量名?
问题如下:
打搅一下大家,求教个问题,已知 list = [‘A’, ‘B’, ‘C’, ‘D’] , 如何能力失去以 list 中元素命名的新列表 A = [], B = [], C = [], D = []呢?
简略了解,这个问题的意思是,将字符串内容作为其它对象的变量名。
list 中的元素是字符串,此处的‘A’-‘D’是常量,而在要求的后果中,A-D 是变量。
如果强行间接将常量当做变量应用,它会报错:
>>> 'A' = []
...SyntaxError: can't assign to literal
报错中的 literal 指的是字面量,这是计算机科学中常见的一个概念,用于表白源代码中的固定值。例如,整数、浮点数、字符串等根本类型,就是字面量。
字面量指的就是一个量自身,能够了解为一种原子性的实体,当然不能再被赋值了。
所以,取出的字符串内容,并不能间接用作变量名,须要另想办法。
有初学者可能会想,list[0] = [] 行不行?当然不行,因为没有呈现 A。那 A = list[0],接着 A = [] 呢?那也不行,因为这里的 A 是你凭空定义进去的,而不是从已有条件中生成的。
过后,,咱们没想到解决办法。然而,我感觉这个题目很有意思,值得玩味。
因为,如果能解决这个问题,那就意味着能够不作事后定义,而是动静地生成变量名,这不仅能缩小给变量取名的麻烦,还实现了自动编码!
能够构想一下将来,人工智能在编写代码的时候,如果能依据已知条件,动静生成变量名,那编写代码的过程不就顺利多了么?(据说,当初曾经有人工智能能够编写代码了,不知它在取变量名时,是用的什么办法?)
2、方法总是有的
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>> globals()[i] = []
>>> A
[]
这个办法通过批改全局命名空间,奇妙地“定义”出了新的变量。globals() 办法取出来的是一个字典,字符串‘A’是其中一个键值(key),而这个键值恰好是全局命名空间中的一个变量,这就实现了从常量到变量的转化。
在数据结构层面上,空列表 [] 作为一个值(value)跟它的字符串键值绑定在一起,而在使用层面上,它作为变量内容而跟变量名绑定在一起。
看到这个答复的时候,我就忽然想起来了,我仿佛只关注了 globals() 与 locals() 用法的区别,却没有真正地把握它们的原初用处。
3、动静执行代码的办法
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>> exec(f"{i} = []")
>>> A
[]
他的写法用到了 Python 3.6 才引入的 f-strings 个性,事实上,在较低版本中,也是能够实现的,只须要保障 exec() 办法接管的参数是蕴含了变量 i 的字符串即可,例如这样写:
# 以下代码可替换上例的第 4 行
exec(i + "= []")
# 或者:exec("{} = []".format(i))
# 或者:exec(''.join([i,'= []']))
这几种写法的区别只是字符串拼接法的区别
这个外围在于 exec() 办法,它是内置的,用处是执行贮存在字符串或文件中的代码段。
它的根底用法如下:
>>> exec('x = 1 + 2')
>>> x
3
# 执行代码段
>>> 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”即可收费获取,每日干货分享