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函数中再次初始化,这会导致错误吗?
答案 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