为什么不改变我的全局变量的值生效?
我是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
谢谢!
如果您的电子邮件地址为from myModule import *
,则在导入的位置创建名为hidNow
的变量。该新变量与myModule
内部的hidNow
分开。它们最初具有相同的值,但从myModule
中为hidNow
分配新值不会更改您已导入的值。
一个解决方案是不要使用*
导入。相反,这样做:
import myModule
print myModule.hidNow
myModule.loginFromSql()
print myModule.hidNow # will change
(这是我认为你问,但你的问题和代码都不清楚,所以请编辑并纠正它,如果这是你在说不是什么。)
你应该考虑为什么你要使用全局变量来存储这些信息。全局变量很脆弱。
你定义了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
如果这些代码被添加到文件中,那么这是真的,但如果这些代码是直接在python交互模式下输入的话,则不是这样的 –
@ Yu-Chih,没有他们在交互模式下工作。尝试复制/粘贴到解释器中。 – tdelaney
我使用一个全局变量来控制我的设计容易,调试尤其是 。
我要去掩饰实际问题(作为另一个答案已经指出的原因),并解决这个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
@RobertSadler你在哪里打开标记!? – admdrew
请修复您的缩进,您的代码不可读。 – BrenBarn
你调用了loginFromSql函数吗?只有在调用函数时才会进行赋值。 – tdelaney