我试图在Python中编写一个创建变量的循环,并使用创建的尚未创建的变量来生成线性方程组。这是我到目前为止所得到的:
P=[[0, 0, 0, 0.5, 0, 0.5],
[0.1, 0.1, 0, 0.4, 0, 0.4],
[0, 0.2, 0.2, 0.3, 0, 0.3],
[0, 0, 0.3, 0.5, 0, 0.2],
[0, 0, 0, 0.4, 0.6, 0],
[0, 0, 0, 0, 0.4, 0.6]]
for j in range(6):
globals()['x%s' % j] = 0
for i in range(6):
globals()['x%s' % j] += P[i][j]*globals()['x%s' % i]
但由于最后一行,我得到KeyError
输出。我想这是因为第二个变量(globals()['x%s' % i]
)尚未定义,但我不知道如何在等号的右侧使用变量
答案 0 :(得分:1)
首先,不使用globals()
(或者实际上几乎从不);创建自己的字典来存储动态创建的值:
vars = {}
vars['blabla'] = 123
你获得KeyError
的原因是你试图从globals()
中读取一个不存在的变量(但这也会发生在自定义词典中)。这一行:
globals()['x%s' % j] += P[i][j]*globals()['x%s' % i]
实际上是简称:
globals()['x%s' % j] = globals()['x%s' % j] + P[i][j]*globals()['x%s' % i]
但globals()['x%s' % j]
尚未定义。所以你试图在不存在的东西上添加东西。
相反,在执行+=
操作之前,您需要执行以下操作:
if 'x%s' % j not in globals():
globals()['x%s' % j] = 0
但是,如果你正确地使用dict
和其他一些增强功能,它将如下所示:
# it's nicer to use floats uniformly, not a mix of ints and floats;
# it's also safer because in Python 2.x, int divided by float will yield a floored down int
P = [[0.0, 0.0, 0.0, 0.5, 0.0, 0.5],
[0.1, 0.1, 0.0, 0.4, 0.0, 0.4],
[0.0, 0.2, 0.2, 0.3, 0.0, 0.3],
[0.0, 0.0, 0.3, 0.5, 0.0, 0.2],
[0.0, 0.0, 0.0, 0.4, 0.6, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.4, 0.6]]
vars = {}
for j in range(len(P)):
vars['x%s' % j] = 0
for i in range(len(P[0])):
vars.setdefault('x%s' % j, 0.0) # shorthand for the `if` I described
vars['x%s' % j] += P[i][j] * vars['x%s' % i]
此外,由于vars
似乎最终只包含x0
到x5
的键,我宁愿使用list
代替
X = [0] * len(P) # creates [0, 0, 0, 0, 0, 0]
for j in range(len(P)):
for i in range(len(P[0])):
X[j] += P[i][j] * X[i]
这样,您甚至不需要setdefault
来电。
请记住,我不熟悉您尝试实现的数学算法/计算,因此我也无法发现代码中的任何非技术性错误或缺点。