-3

对kgiannakakis很有帮助。我面临以下问题:

a = ['zbc','2.3']
for i in range(0,5):
    exec('E%d=%s' %(i,a[i]))

这导致:

回溯(最近一次通话最后):
  文件“”,第 2 行,在
    exec('E%d=%s' %(i,a[i]))
  文件“”,第 1 行,在
NameError:名称'zbc'未定义
4

4 回答 4

2

看起来您生成的代码扩展为:

E0=zbc
E1=2.3

在循环的下一次迭代中,您将得到一个 IndexError 异常,因为a它只有两个元素长。

因此,鉴于上述情况,您正在尝试分配 to 的zbcE0。如果zbc不存在(似乎不存在),那么您将收到您提到的 NameError 。

很难确定您实际上要使用此代码做什么,因此我不确定该推荐什么。您可以改为分配字符串:

exec('E%d="%s"' %(i,a[i]))

这将扩展为:

E0="zbc"
E1="2.3"

您仍然会收到 IndexError,因为您的数组a不是 5 个元素长。这对你来说应该很容易解决。

于 2008-12-18T06:55:56.960 回答
0

好的。这段代码很奇怪。

作为这样的单行符,它在语法上不正确,但我怀疑您由于某种原因缺少换行符。但后来它变成了

a = ['zbc','2.3']
for i in range(0,5): 
    exec('E%d=%s' %(i,a[i]))

但这将导致对 a[i] 的引用出现索引错误,如下所示:

>>> a
['zbc', '2.3']
>>> for i in range(0,5):
...    print a[i]
... 
zbc
2.3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

如果你避免了这个问题,你会得到

exec("E2.3=1")

在第二次通过lopp时,这也是一个语法错误。

于 2008-12-18T05:54:23.903 回答
0

您似乎正在尝试使用问题中标记的解决方案。

如果您的目标是循环访问值,则应该只使用列表。这种带有数字的变量名称的奇怪概念不应该在任何语言中使用。试试这个。

vals = ['foo', 'bar', 'blah', 67, -0.4, 'your mom']
for i in range(len(vals)):
    print(vals[i])

这是获得由整数索引的值列表的正确方法,而不是将其放在变量名中。

于 2008-12-18T19:42:31.080 回答
0

请记住,'exec' 执行您传递给它的任何字符串,就好像您在 .py 文件或解释器中键入它一样。

在调试 exec() 相关代码时,在遇到麻烦时记录您将要“执行”的任何内容会很有帮助,如果这样做,您很容易注意到 E0 没有被分配给字符串“zbc”但是对于不存在的对象zbc。

除此之外,这个代码示例真的很奇怪。将字符串解析为实例变量或其他命名空间中的对象有一些合法用途,最值得注意的是,当您编写一个高度动态的类时,该类需要用混乱的输入做一些明智的事情,或者需要从一个字典或字符串。但是如果没有上下文,您问题中的代码看起来像是在避免或不理解如何使用 list() 和 dict() 对象。

我建议您在下次就这样奇特的事情提出问题时,多谈谈您要达到的目标。这会给人们一个很好的机会来提出更好的解决方案,或者——如果你以一种完全明智的方式处理一个特定的问题——防止一堆答案告诉你你做的事情完全错误。

于 2008-12-19T18:03:18.217 回答