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