Python Don';我不理解未定义的引用

Python Don';我不理解未定义的引用,python,python-3.x,scope,Python,Python 3.x,Scope,我的理解是,如果我在函数中使用一个变量,而函数中没有赋值语句,那么它会在函数的“外部”寻找变量 列表似乎就是这样,但不是一个简单的变量 在下面的代码中,我被告知语句“aa+=1”包含一个未解析的引用“aa”,但对bb[0]的引用很好。这是为什么 aa = 0 bb = [9, 7] def bbtest(): aa += 1 bb[0] += 1 这有点模糊,但有一个原因:在编译函数时,Python会查看其中使用的所有名称,并确定它们来自哪个范围。未指定的名称将使用外部范围(

我的理解是,如果我在函数中使用一个变量,而函数中没有赋值语句,那么它会在函数的“外部”寻找变量

列表似乎就是这样,但不是一个简单的变量

在下面的代码中,我被告知语句“aa+=1”包含一个未解析的引用“aa”,但对bb[0]的引用很好。这是为什么

aa = 0
bb = [9, 7]

def bbtest():
    aa += 1
    bb[0] += 1

这有点模糊,但有一个原因:在编译函数时,Python会查看其中使用的所有名称,并确定它们来自哪个范围。未指定的名称将使用外部范围(全局或非局部),分配给的名称是本地的。由于
aa+=1
计为分配,因此它将
aa
标记为本地变量

虽然下一行看起来很相似,但它做了一些不同的事情:您没有为名称
bb
分配某些内容。您正在从非本地/全局名称(列表)中检索某些内容,然后分配给其中的一个元素


您可以通过将
aa
明确标记为非本地或全局来解决此问题:

def bbtest():
    global aa
    aa += 1
    bb[0] += 1
另一方面,您可以通过指定名称使
bb
案例失败,甚至在之后:


这是因为在python中,您只能访问全局变量,但不能在函数中修改它们。 您可以更改bb[0]值,因为它在全局变量中,而不是var本身。 无论如何,如果希望它工作,请尝试在函数中声明“全局”,如下所示:

aa = 0
bb = [9, 7]

def bbtest():
    global aa
    aa += 1
    bb[0] += 1

您使用的是什么语言?请适当标记您的问题。python 3.8,使用pycharm。在mac OS10.14.6上运行可能与-您正在尝试使用
+=
maybe重新绑定名称
aa
?您可以通过显式将aa标记为非本地或全局来修复此问题:“---或者更确切地说,通过传入然后返回
aa
可能?不过顺便说一句,答案很好。@Dan当然,这可能是一个更好的选择。但是您可以通过使用
global
nonlocal
来修正Python关于
aa
是本地的(在本例中不是本地的)假设。
aa = 0
bb = [9, 7]

def bbtest():
    global aa
    aa += 1
    bb[0] += 1