当我调用函数“G()
”时会返回两个值:p_T
和q_T
两次(见下文),但使用相同的样式,即P_T, neg = G(); U, Ign = G()
和打印P_T
和U
的总和,我得到两个不同的答案!另一件事是两个答案都不正确!
我只包含部分代码,可以简单地帮助解释这个想法。 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)
答案 0 :(得分:4)
你有全球状态。你改变了全球状态。然后你再次改变它,从你离开的地方开始。因此P_T是N次操作后的结果,U是2N次操作后的结果。
不要使用全局状态。
答案 1 :(得分:2)
因为p_T
和q_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)
一般来说,全局变量被认为是糟糕的编程习惯,因为它们会导致一个混乱的状态,而这个状态并没有像你所发现的那样局限于所考虑的函数。