为什么不改变全局变量的值会生效?

时间:2013-10-29 19:46:03

标签: python variable-assignment

我是python的新手,我使用全局变量来轻松控制我的设计,尤其是调试。

这是我的代码:

hidNow = -1
def loginFromSql(br, n=0):
    global hidNow
    print hidNow
    hidNow = 5566
    print hidNow
print(hidNow)

我直接使用"从myModule import *"

运行python

在调用函数之前,打印hidNow获得-1的结果,但是即使函数被调用它仍然是-1。

它是python中的错误吗?我使用的是python 2.7.5

谢谢!

3 个答案:

答案 0 :(得分:6)

如果您执行from myModule import *,则会在导入的位置创建一个名为hidNow的变量。此新变量与hidNow内的myModule分开。它们最初具有相同的值,但是从hidNow内部为myModule分配新值不会更改已导入的值。

一种解决方案是不要使用*导入。而是做:

import myModule
print myModule.hidNow
myModule.loginFromSql()
print myModule.hidNow # will change

(这是我认为你问的问题,但你的问题和代码不清楚,所以如果这不是你得到的,请编辑并纠正它。)

您应该考虑使用全局变量存储此信息的原因。全局变量很脆弱。

答案 1 :(得分:2)

  

我正在使用全局变量来轻松控制我的设计,尤其是   用于调试。

clippy

我要掩饰实际问题(因为另一个答案已经指出了原因)并解决了这个XY problem的X部分。

这并不像你想象的那样容易控制你的设计,在模块级别使用全局变量通常是不必要的,并且在许多python开发中看起来像code smell

维护状态的一个更好的方法是使用类,如下所示:

# myModule.py
class Thing(object):

  def __init__(self, hidNow=-1):
    self.hidNow = hidNow

  def loginFromSql(self, br, n=0):
    self.hidNow = 5566

在这里,您可以看到此属性的访问方法,并查看值发生的变化。

>>> from myModule import *
>>> my_thing = Thing()
>>> my_thing.hidNow
-1
>>> my_thing.loginFromSql('potato')
>>> my_thing.hidNow
5566

答案 2 :(得分:0)

您定义了loginFromSql,但您没有调用它。这是您的示例脚本,带有一些额外的打印和对函数的调用。

hidNow = -1
def loginFromSql(br, n=0):
    global hidNow
    print "login start", hidNow
    hidNow = 5566
    print "login done", hidNow

print "before call", hidNow
loginFromSql('x')
print "after call", hidNow

运行它时,会得到此输出,表明全局确实发生了变化

before call -1
login start -1
login done 5566
after call 5566