我觉得在运行时创建新变量并创建结果的字典以便稍后处理,例如写入文件,非常有用:
myDict = {}
for i in range (1,10):
temp = "variable"+str(i)
vars()[temp] = myFunctionThatReturnsData() # variable1= data1, variable2 = data2,etc.
myDict[temp] = vars(temp)
通过 myDict[result1] = data1
创建了字典项 [result1:data1],我可以通过 myDict[result1] 调用它。之前一直在使用 vars(),但并不真正理解我在做什么。我想,vars()
返回一个带有局部变量的字典(?), 而
vars()[x] = y
创建了一个新的字典项[x:y]?
我有一个脚本,我传入一个已准备好的字典 {input1:data1,input2:data2} ,然后使用这种方法遍历所有值、存储所有结果并将其输出到文件中。这段代码在类中的一个函数内部,目前正常工作。
我的困惑源于我已经阅读过各种帖子,说明 locals() 不应该被弄乱,而 vars() 相当于 locals() 或 globals() ..
所以我至少有两个问题:
1. vars() 到底是什么,或者特别是,vars()[x] = y 做了什么,
2. 这个字典的范围是什么(我在编写更大型程序时需要记住什么),
3. 是否是良好的编程实践。
提前感谢!
vars()['x'] = 4
和x = 4
在某些情况下实际上是等效的。如果您在函数中这样做,并且没有在其他地方设置x
,并且编译器对该函数进行了优化,则稍后在函数中正常查找x
(即y = x + 2
)将无法正常工作。我认为编译器会缓存它可以看到的变量(可能在编译时定义),并且不考虑这种花招。如果您向函数添加 exec 语句,则编译器将不会尝试优化该函数。 - Matt Andersonlocals()[...]
具有未定义的行为。https://dev59.com/0msz5IYBdhLWcg3wQFUq - ninjageckofor _ in xrange(10):
,而不是(请注意,在 for 循环中我们甚至不需要 i。我们只是想要进行 10 次循环。)
? - boardrider