X未定义但x已定义
import ti_pltlib as plt
class Field:
self.equation = 2*x+2*y
for pos_x in range(plt.xmin, plt.xmax):
for pos_y in range(plt.ymin, plt.ymax):
x = pos_x-0.25
y = pos_y-0.25
x0 = eval(self.equation) #Error occurs right here
x += 0.5
x1 = eval(self.equation)
y0 = eval(self.equation)
y += 0.5
y1 = eval(self.equation)
我正在用Python为TI-84计算器写一个程序。这个程序的目的是让用户输入一个微分方程,然后处理这个方程,并为它绘制一个斜率点场。
我遇到的问题是eval函数(我知道,这有安全风险)。当我用这个函数来评估方程时,它给我报错,提示“名称'x'未定义”。
这个错误只在计算器上运行程序时出现,而在我电脑上运行那段代码时没有问题。问题是'x'在之前已经定义过了。为什么会这样呢?
更详细的错误信息是:
'File "<stdin>", line 1, in <module>
File "FEILD.py", line 45, in <module>
File "FEILD.py", line 45, in <module>
File "<string>", line 1, in <module>
NameError: name 'x' is not defined'
1 个回答
5
要记住,TI-84 计算器运行的是 micropython(其实是 circuitpython),而MicroPython 不是 Python。在这两种语言中写代码时,你需要了解它们之间的区别。在这个情况下,你遇到的问题是eval()
在 micropython 中无法访问局部变量:
MicroPython 不维护符号局部环境,它被优化为一个插槽数组。因此,局部变量不能通过名称访问。实际上,MicroPython 中的 eval(expr) 相当于 eval(expr, globals(), globals())。
那份完整文档值得一读;它讨论了 CPython(也就是“常规 Python”)和 MicroPython 之间的许多区别。