Python中多次返回的异常问题

时间:2011-08-22 16:28:10

标签: python

当我调用函数“G()”时会返回两个值:p_Tq_T两次(见下文),但使用相同的样式,即P_T, neg = G(); U, Ign = G()和打印P_TU的总和,我得到两个不同的答案!另一件事是两个答案都不正确!

我只包含部分代码,可以简单地帮助解释这个想法。 for循环下函数G()内的语句块按循环建议执行N次。全局变量声明是否存在某些损害?

对任何错误以及如何解决问题的任何建议表示赞赏!

def G():
    global p_T; global q_T

    for n in range(N):
        p_T = U_T(EvolveU_T(p_T))
        q_T = V_T(EvolveV_T(q_T))

    return p_T, q_T

P_T, neg = G()
print sum(P_T)
U, Ign = G()
print sum(U) 

2 个答案:

答案 0 :(得分:4)

你有全球状态。你改变了全球状态。然后你再次改变它,从你离开的地方开始。因此P_T是N次操作后的结果,U是2N次操作后的结果。

不要使用全局状态。

答案 1 :(得分:2)

因为p_Tq_T是全局变量,所以它们的范围不是函数的本地范围。因此,在调用该函数两次后得到两个不同的答案就不足为奇了。这是一个简单的例子,演示了正在发生的事情:

class C:
    foo = ''

    def __repr__(self):
        return self.foo

x, y = C(), C()

def F():
    global x
    global y

    x.foo += 'x'
    y.foo += 'y'

    return (x, y)

print F()
print F()

全局变量x和y保持它们的值,因为它们没有作用于函数。如果在没有global修饰符的函数内声明并初始化它们,则会看到(x,y)两次。但你会看到:

(x, y)
(xx, yy)

一般来说,全局变量被认为是糟糕的编程习惯,因为它们会导致一个混乱的状态,而这个状态并没有像你所发现的那样局限于所考虑的函数。