我是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
谢谢!
答案 0 :(得分:6)
如果您执行from myModule import *
,则会在导入的位置创建一个名为hidNow
的变量。此新变量与hidNow
内的myModule
分开。它们最初具有相同的值,但是从hidNow
内部为myModule
分配新值不会更改已导入的值。
一种解决方案是不要使用*
导入。而是做:
import myModule
print myModule.hidNow
myModule.loginFromSql()
print myModule.hidNow # will change
(这是我认为你问的问题,但你的问题和代码不清楚,所以如果这不是你得到的,请编辑并纠正它。)
您应该考虑使用全局变量存储此信息的原因。全局变量很脆弱。
答案 1 :(得分:2)
我正在使用全局变量来轻松控制我的设计,尤其是 用于调试。
我要掩饰实际问题(因为另一个答案已经指出了原因)并解决了这个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