Python: 2.6: 尝试构建类似 exec('if' + varname + '< 1.0:') 的语句

0 投票
3 回答
932 浏览
提问于 2025-04-17 08:23

我的目标是让一个循环里的if语句可以使用不同的变量名。那些语句是在另一个文件里的一个函数中:我已经设置好了合适的导入方式。

举个例子:

for i in range(0,10):

    myvar = ''
    myvar = myvar + str(i)
    exec('if' + myvar + '< 0:')
`do something`

它在“做某事”的部分提示“意外的缩进”。我去掉了缩进后,它又提示:KeyError: 'myvar1'。我试着用这个代替:

if vars()[myvar] < 0:

    do something 

结果还是给我同样的 KeyError: 'myvar1'

有没有办法让这样的变量声明正常工作呢?

3 个回答

0

如果你想做类似这样的事情:

var1 = 10
var2 = 12
var3 = 18

for i in range(10):
  if locals().get('var%d' % i, 0) > 10:
    # something here for the conditions that pass.

这段代码应该可以正常运行。你之前做的最大的不同之处在于,我在 locals() 上调用了 .get() 方法,这样如果你尝试测试一个不存在的变量,它会返回一些东西。说实话,这种做法有点奇怪,但有时候奇怪的方法也是必要的。

1

所以你真的应该把你的代码改一下,把myvarN存成一个列表。这样你就可以直接这样做:

for element in myvars:
    if element < 0:
        doSomething(element)
3

你正在把字符串 "if 0 < 0:" 传给 exec() 函数。这个写法在语法上是不正确的,因为它缺少了控制语句的内容。你可以考虑这样做:

if eval(myvar) < 0:
    do_something()

不过更一般来说,在实际的程序中,动态地评估变量名几乎总是错误的做法。通常情况下,使用字典来将键映射到值会更好(这就是字典的用途,而且你可以避免使用 exec() 和 eval())。

撰写回答