Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在字符串中动态更改变量的值?_Python - Fatal编程技术网

Python 如何在字符串中动态更改变量的值?

Python 如何在字符串中动态更改变量的值?,python,Python,我从文本e-gs=“a&(b | c)”中提取了一个数学字符串,我想使用eval(s),但在此之前,我必须为变量赋值,比如: a, b, c = somefuction() 我如何动态地这样做 r = re.findall("\w+", s) r[0], r[1], r[2] = somefunction() 然后将这些值传递回变量,并对其使用eval()。 基于a、b、c的值,我的最终输出应该给出True或False,假设findall正确地找到了变量,并且函

我从文本e-g
s=“a&(b | c)”
中提取了一个数学字符串,我想使用
eval(s)
,但在此之前,我必须为变量赋值,比如:

a, b, c  = somefuction()
我如何动态地这样做

r = re.findall("\w+", s)    
r[0], r[1], r[2] = somefunction()
然后将这些值传递回变量,并对其使用
eval()

基于a、b、c的值,我的最终输出应该给出True或False,假设
findall
正确地找到了变量,并且函数返回了相应的元组,那么您可以使用
exec
设置变量:

r = re.findall("\w+", s)
vars = ', '.join(r)
exec(vars + ' = somefunction()')
在您的示例中,这将构造字符串
a,b,c=somefunction()
,并执行它,从而在当前名称空间中设置变量

由于在注释中您声明变量的数量可能不同,因此您可能希望将该数量发送到函数:

exec('{} = somefunction({})'.format(vars, len(r)))

或者,如果函数总是返回相同数量的元素,但根据提取的数学表达式,可能无法使用一个或多个元素,则可能需要在
vars
字符串中附加或前置(下划线),以取代未使用的值。

使用dict代替变量,从

这是我发现的最好的方法,但我相信它可以更短:

import re

s = "a&(b|c)"
sometuple = 7, 1, 2  # Stand-in for "somefunction()"

names = re.findall(r"\w+", s)
vals = {name: val for name, val in zip(names, sometuple)}  # Map names to values
# > {'a': 7, 'b': 1, 'c': 2}

s_spec = re.sub(r"(\w+)", r'{\1}', s)  # Mark names for interpolation
# > '{a}&({b}|{c})'

filled = s_spec.format(**vals)  # Interpolate
# > '7&(1|2)'

print(eval(filled))  # -> 3

如果使用
eval()
,它通常只使用本地名称空间中的任何变量。如果您在调用
eval()
之前分配了名为
a
b
c
的变量,那么它应该使用它们的当前值。@问题是,我正在从文本中提取该字符串。稍后我必须使用somefunction分配值。您可能希望使用
re.sub()
将它们替换为,比如说,
{}
,然后使用
str.format()
替换所需的值。如果不知道你的输入是什么样子,输出应该是什么样子,就不可能给出更全面的答案。@greencapegy好主意,让我试试。我希望有一种更简单的python方法。你对变量了解多少?你知道有多少,或者是动态变化的吗?您能否保证它们是提取字符串中唯一的字母字符(即“\w+”将正确提取)?