Python'全局'返回“名称未定义”

时间:2013-07-02 04:26:12

标签: python python-2.7

使用以下代码

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

2 个答案:

答案 0 :(得分: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 x放入A(),以便可以在B()中访问它。但是,您仍需将global x留在B(),这样就无法获得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

答案 1 :(得分:1)

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

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

    print B(x)


if __name__ == '__main__':    
    A()