我的理解是,如果我在函数中使用变量而在函数中没有赋值语句,则它将在函数外部查找该变量。
列表似乎是这种情况,但不是简单的变量。
在下面的代码中,我被告知语句“ 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"