我的理解是,如果我在函数中使用变量而在函数中没有赋值语句,则它将在函数外部查找该变量。

列表似乎是这种情况,但不是简单的变量。

在下面的代码中,我被告知语句“ 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大小写失败:

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

08-16 15:44
查看更多