在Python中循环创建和使用多个变量

时间:2014-04-27 12:58:42

标签: python-2.7 for-loop global-variables

我试图在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])尚未定义,但我不知道如何在等号的右侧使用变量

1 个答案:

答案 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似乎最终只包含x0x5的键,我宁愿使用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来电。


请记住,我不熟悉您尝试实现的数学算法/计算,因此我也无法发现代码中的任何非技术性错误或缺点。