这对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'未定义
看起来您生成的代码扩展为:
E0=zbc
E1=2.3
在循环的下一次迭代中,您将得到一个 IndexError 异常,因为a
它只有两个元素长。
因此,鉴于上述情况,您正在尝试分配 to 的zbc
值E0
。如果zbc
不存在(似乎不存在),那么您将收到您提到的 NameError 。
很难确定您实际上要使用此代码做什么,因此我不确定该推荐什么。您可以改为分配字符串:
exec('E%d="%s"' %(i,a[i]))
这将扩展为:
E0="zbc"
E1="2.3"
您仍然会收到 IndexError,因为您的数组a
不是 5 个元素长。这对你来说应该很容易解决。
好的。这段代码很奇怪。
作为这样的单行符,它在语法上不正确,但我怀疑您由于某种原因缺少换行符。但后来它变成了
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时,这也是一个语法错误。
您似乎正在尝试使用此问题中标记的解决方案。
如果您的目标是循环访问值,则应该只使用列表。这种带有数字的变量名称的奇怪概念不应该在任何语言中使用。试试这个。
vals = ['foo', 'bar', 'blah', 67, -0.4, 'your mom']
for i in range(len(vals)):
print(vals[i])
这是获得由整数索引的值列表的正确方法,而不是将其放在变量名中。
请记住,'exec' 执行您传递给它的任何字符串,就好像您在 .py 文件或解释器中键入它一样。
在调试 exec() 相关代码时,在遇到麻烦时记录您将要“执行”的任何内容会很有帮助,如果这样做,您很容易注意到 E0 没有被分配给字符串“zbc”但是对于不存在的对象zbc。
除此之外,这个代码示例真的很奇怪。将字符串解析为实例变量或其他命名空间中的对象有一些合法用途,最值得注意的是,当您编写一个高度动态的类时,该类需要用混乱的输入做一些明智的事情,或者需要从一个字典或字符串。但是如果没有上下文,您问题中的代码看起来像是在避免或不理解如何使用 list() 和 dict() 对象。
我建议您在下次就这样奇特的事情提出问题时,多谈谈您要达到的目标。这会给人们一个很好的机会来提出更好的解决方案,或者——如果你以一种完全明智的方式处理一个特定的问题——防止一堆答案告诉你你做的事情完全错误。