2

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

这是我的代码:

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

我直接用“from myModule import *”运行python

在调用函数之前, print hidNow 得到-1的结果,但即使调用了函数,它仍然是-1....

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

谢谢!

4

3 回答 3

6

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

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

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

(这就是我认为您要问的问题,但是您的问题和代码不清楚,因此,如果这不是您要解决的问题,请进行编辑和更正。)

您应该考虑一下为什么要使用全局变量来存储这些信息。全局变量是脆弱的。

于 2013-10-29T19:52:31.317 回答
2

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

剪辑

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

这并没有像您想象的那样真正轻松地控制您的设计,在模块级别使用全局变量通常是不必要的,并且对于许多 python 开发人员来说,这会表现为代码异味

维护状态的更好方法是使用一个类,它会是这样的:

# 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
于 2013-10-29T20:24:04.977 回答
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
于 2013-10-29T20:18:39.407 回答