0

使用下面的代码

def A():    
    print "in A"

    def B():
        global x
        x += 1
        y += 1
        print "in B"

    x = 0
    y = 0
    print x, y                    
    B()
    print x, y


if __name__ == '__main__':    
    A()

我得到以下输出和错误

in A
0 0
NameError: global name 'x' is not defined

使用全局的正确方法是什么?实际上,我正在尝试更改子函数 B 中的 x 并将其返回给 A。还尝试检查非全局 y,并查看外部函数中发生了什么。


从 Haidro 给出的提示中得到它

def A():

    print "in A"

    def B():
        global x        
        x += 1
        y = 1
        print "in B"

    global x
    x = 0
    y = 0
    print x, y                    
    B()
    print x, y
4

2 回答 2

2

您还需要global x输入A()

def A():    
    print "in A"

    def B():
        global x
        global y # Also, don't forget to globalise y!
        x += 1
        y += 1
        print "in B"
    global x
    global y
    x = 0
    y = 0
    print x, y                    
    B()
    print x, y


if __name__ == '__main__':    
    A()

您必须输入global xA()以便可以在B(). 但是,您仍然必须离开global xB()这样您就不会得到UnboundLocalError: local variable 'x' referenced before assignment


您可能需要重新考虑您的结构。也许使用一个类?

class MyClass(object):
    def __init__(self):
        self.x = 0
        self.y = 0

    def A(self):
        print "in A"
        print self.x, self.y      
        self.B()
        print self.x, self.y

    def B(self):
        self.x += 1
        self.y += 1
        print "in B"

me = MyClass() # Create an instance of the class
me.A()
me.B()
print me.x, me.y

这将返回:

in A
0 0
in B
1 1
in B
2 2
于 2013-07-02T04:30:08.633 回答
1

您可能并不想使用全局变量。一般来说,它们只应在绝对必要时使用。我认为这就是您要实现的目标:

def A():    
    print "in A"
    x = 5
    def B(x):
        print "in B"
        return x

    print B(x)


if __name__ == '__main__':    
    A()
于 2013-07-02T04:35:10.253 回答