有些变量的命名规则是类似的,比如obj1,ojb2,obj3,等等。如果我想把他们加入到list中,常规操作就是一个一个的加,但是当这样的变量数量越来越多时,就不能这么做了,是会累死人的。
那么想到了一个办法,既然变量的命名是有规则的,根据规则我用字符串拼接出变量的名字,再利用eval()函数根据名字获取该对象的引用,这样不就能批量操作了么。
看一个例子:
obj1 = 'abc'
obj2 = [1, 2, 3]
obj3 = {'a': 1, 'b': 2, 'c': 3}
obj4 = {1, 2, 3, 4}
obj5 = (1, 2, 3)
obj6 = (x for x in range(1,5))
obj7 = 123
list_content = []
for i in range(1, 8):
content = 'obj' + str(i)
list_content.append(eval(content))
print(list_content)
content表示拼接好的变量,然后使用eval()函数获取对象,在利用list.append()函数加入list。
关键点在于这个eval()函数,之前不知道有这么个函数,自然被这个问题困扰。
那么我们看一下eval()这个函数是干啥的。
cmd+左键点击,调到函数定义的地方,跳到了builtins.py中。
根据函数文档的描述来看,eval()的作用就是“评估全局或者局部上下文的中源”,听起来像文言文,理解一下,根据给定的字符串来寻找全局或者局部作用于的变量。这样好一点了吧?
会到刚才的例子中,再结合函数的文档注释,“The source may be a string representing a Python expression or a code object as returned by compile().”,source可能用一个字符串来表示一个python表达式或者一个被compile()函数返回的对象。
一切都清晰了,eval(source),source就是变量的名字(type: str)。