我发现能够在运行时创建新变量并创建结果字典以供以后处理(即写入文件)非常有用:
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] 调用的字典条目 [result1:data1]。我一直在使用 vars() 却没有真正理解我在做什么。我把它 vars()
返回一个带有局部变量的字典(?),并且
vars()[x] = y
创建一个新的字典条目 [x:y] ?
我有一个脚本,我传入一个用 {input1:data1,input2:data2} 准备的字典,我使用这个方法遍历所有值,存储所有结果,并将其输出到文件。这段代码在一个类的函数内部,并且正在工作。
我的困惑是我已经阅读了很多关于 locals() 不应该被弄乱的帖子,以及 vars() 如何等同于(?) 到 locals() 或 globals()..
所以我的问题(至少)有两个方面:
1. vars(),或者特别是 vars()[x] = y 到底是做什么的,
2.这本词典的范围是什么(写大程序时需要注意的地方
3.这是否是好的编程习惯。
提前致谢!
最佳答案
创建变量序列的pythonic方法
如果您想要一个变量序列,请创建一个序列。而不是尝试创建独立变量,例如:
variable0
variable1
variable2
variable3
您应该考虑创建一个 list
。这类似于 S.Lott 的建议(S.Lott 通常有很好的建议),但更巧妙地映射到您的 for
循环:
sequence = []
for _ in xrange(10):
sequence.append(function_that_returns_data())
(请注意,我们丢弃了循环变量 (_
)。我们只是想通过 10 次。)
那么您的数据将以下列形式提供:
sequence[0]
sequence[1]
sequence[2]
sequence[3]
[...]
sequence[9]
作为额外的奖励,您可以这样做:
for datum in sequence:
process_data(datum)
一开始,您可能会对序列从 0 开始感到不安。您可以通过各种扭曲来让实际数据从 1 开始,但这比它的值(value)更痛苦。我建议习惯于使用从零开始的列表。一切都是围绕着它们构建的,它们很快就会变得自然。
vars() 和 locals()
现在,回答您问题的另一部分。 vars()
(或 locals()
)提供对 python 创建的变量的低级访问。因此下面两行是等价的。
locals()['x'] = 4
x = 4
vars()['x']
的作用域与x
的作用域完全相同。 locals()
(或 vars()
)的一个问题是,它会让你将无法通过正常方式从命名空间中取出的东西放入命名空间中.所以你可以做这样的事情:locals()[4] = 'An integer'
,但是你不能在不再次使用 locals 的情况下恢复它,因为本地命名空间(与所有 python namespaces) 仅用于保存字符串。
>>> x = 5
>>> dir()
['__builtins__', '__doc__', '__name__', 'x']
>>> locals()[4] = 'An integer'
>>> dir()
[4, '__builtins__', '__doc__', '__name__', 'x']
>>> x
5
>>> 4
4
>>> locals()[4]
'An integer'
请注意,4 不会返回与 locals()[4] 相同的内容。这可能会导致一些意想不到的、难以调试的问题。这是避免使用 locals()
的原因之一。另一个原因是,仅仅做 python 提供的更简单、不易出错的方法(比如创建变量序列)通常会很复杂。
关于Python:使用 vars() 将字符串分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2320945/