我发现能够在运行时创建新变量并创建结果字典以供以后处理(即写入文件)非常有用。
myDict = {}
for i in range (1,10):
temp = "variable"+str(i)
vars()[temp] = myFunctionThatReturnsData() # variable1= data1, variable2 = data2,etc.
myDict[temp] = vars(temp)
这将创建字典条目[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.这是否是好的编程习惯。
提前致谢!
创建变量序列的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开始,但这比它的价值还要痛苦。我建议您习惯使用从零开始的列表。一切都围绕着他们建立,他们很快就开始感觉自然。
vars()和locals()
现在,回答您问题的另一部分。 vars()
(或locals()
)提供对python创建的变量的低级访问。因此,以下两行是等效的。
locals()['x'] = 4
x = 4
的范围与的范围vars()['x']
完全相同x
。locals()
(或vars()
)的一个问题是,它将使您将东西放到通常无法通过名称空间移出的名称空间中。因此,您可以执行以下操作:locals()[4] = 'An integer'
,但是您必须再次使用locals才能将其删除,因为local名称空间(与所有python名称空间一样)仅用于保存字符串。
>>> 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中,可以分割字符串并将其分配给变量: 但在Go中似乎无效: 问题: 如何在一个步骤中拆分字符串并分配值? 问题答案: 例如两个步骤 输出: 例如一个步骤 输出:
问题内容: 将数学应用于变量的常用方法是 是否可以像这样计算和操纵两个操作数? 然后我该如何连接op和两个变量以及? 我知道我可以比较运到,,,,然后分配和计算.... 但是我可以做些什么,如何告诉编译器op是运算符? 问题答案: 您可以使用运算符模块和字典:
我想知道是否可以使用并在RegEx中设置多个组,然后将所有匹配的组存储在变量中以供以后使用。 像这样: 这实际上不起作用,但这正是我想要的,我知道我可以将分析字符串封装在一个变量中,但这似乎很愚蠢,因为对于每个我必须处理正则表达式的组,效率不是很高,我应该能够处理正则表达式一次,并存储所有组以供以后使用。 有什么想法吗?
问题内容: 我有以下代码,我想为浮点数指定一个十进制值而又不损失精度。 输出: 5.88 预期输出: 525.880005 问题答案: 仅具有7-8位有效数字。您的示例中的“ 5”是第9位数字。 即使它具有足够的精度,我也不知道525.880005是否可以精确表示为二进制浮点数。大多数十进制值不是:) 如果确切的十进制表示形式对您很重要,则应使用。
问题内容: 我有一个分配了字符串的变量,我想根据该字符串定义一个新变量。 问题答案: 你可以使用exec:
问题内容: 我有一个值为的字符串。我想将字符串分成两个字符串,值为的字符串和的值为字符串。 正确的功能/语法是什么? 我已经看过了,但是找不到将数据返回到两个单独的字符串中的实际语法。 问题答案: 该功能适用于: