2013-10-29 109 views
2

我是python的新手,我使用全局变量来轻松控制我的设计,特别是对于调试。为什么不改变我的全局变量的值生效?

这里是我的代码:

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

我直接运行python “从MyModule的进口*”

之前仍调用该函数,打印hidNow得到-1的结果,但它 - 1即使函数被调用....

它是Python中的错误?我正在使用python 2.7.5

谢谢!

+1

@RobertSadler你在哪里打开标记!? – admdrew

+6

请修复您的缩进,您的代码不可读。 – BrenBarn

+0

你调用了loginFromSql函数吗?只有在调用函数时才会进行赋值。 – tdelaney

回答

6

如果您的电子邮件地址为from myModule import *,则在导入的位置创建名为hidNow的变量。该新变量与myModule内部的hidNow分开。它们最初具有相同的值,但从myModule中为hidNow分配新值不会更改您已导入的值。

一个解决方案是不要使用*导入。相反,这样做:

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

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

你应该考虑为什么你要使用全局变量来存储这些信息。全局变量很脆弱。

+0

如何提及使用类来维护状态而不是全局变量 – wim

+1

@wim:婴儿的步骤,婴儿的步骤。 。 。 :-) – BrenBarn

+0

好的,我会再添加一个答案 – wim

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 
+0

如果这些代码被添加到文件中,那么这是真的,但如果这些代码是直接在python交互模式下输入的话,则不是这样的 –

+0

@ Yu-Chih,没有他们在交互模式下工作。尝试复制/粘贴到解释器中。 – tdelaney

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 
相关问题