全局变量Python

时间:2016-10-17 03:17:13

标签: python list python-2.7 python-3.x global-variables

A=[]

def main():
    global A
    A=[1,2,3,4,5]
    b()

def b():
    if(len(A)>0):
        A=[7,8,9]
    else:
        if(A[3]==4):
            A.remove(2)

main()  

此代码在行A中给出错误。删除(2)给出原因:" UnboundLocalError:局部变量' A'在分配之前引用"

但是一个列表是全局的,并且肯定它已经在main()函数中初始化了。请解释为什么这会给出错误?

由于A已在b函数中再次初始化,这会导致错误吗?

2 个答案:

答案 0 :(得分:2)

你得到这个的原因是因为你在函数中执行了这个赋值:

A = [7, 8, 9]

解释器现在将A视为本地绑定变量。所以,现在会发生什么,看看这个条件:

if(len(A)>0):

实际上会抛出你的第一个UnboundLocalError异常,因为正如你所提到的那样,你从未在global A函数中声明b还创建了一个本地绑定变量A = [7, 8, 9],您在声明之前尝试使用本地A

当您尝试执行此操作时,您实际上面临同样的问题:

A.remove(2)

要解决有关您的代码的问题,只需在global A函数中声明b()

def b():
    global A
    if(len(A)>0):
        A=[7,8,9]
    else:
        if(A[3]==4):
            A.remove(2)

但是,更好,理想和推荐的方法是不使用全局,只是将参数传递给函数

A = [1, 2, 3, 4]


def main(list_of_things):
    # do whatever operations you want to do here
    b(list_of_things)

def b(list_of_things):
    # do things with list_of_things

main(A)

答案 1 :(得分:0)

您必须在任何分配给它的函数中声明变量global

def b():
    global A
    if some_condition:
        A.append(6)
    else:
        A.remove(2)

A范围内未声明global b()的情况下,Python假定A属于b()命名空间。您可以阅读它,但无法对其进行编辑(所做的任何更改都不会保留到 true A

您允许将A设置为函数A = ...内部的某些内容,但在函数范围内仅

如果你试图在函数内部改变A而不在函数的命名空间中定义A,那么Python会告诉你,你试图用UnboundLocalError

通过声明A global,解释器知道您的意思是编辑全局变量。

我假设您的代码看起来像这样(否则,运行正常)

A=[]

if __name__ == '__main__':
    def main():
        global A
        A=[1,2,3,4,5]
        b()

    def b():
        global A
        if some_condition:
            A=[7,8,9]
        else:
            A.remove(2)
        print A

    main()
    print A

print A