2015-03-02 96 views
3

这可能是一个非常愚蠢的问题,但我对于为什么列表的行为与Python 3中的其他变量的行为有关,关于范围,我有点不确定。在下面的代码...Python 3中的列表范围

foo = 1 
bar = [1,2,3,4] 

def baz(): 
    foo += 1 
    bar[0]+=1 

我明白为什么foo += 1抛出关于一个错误foo是当地的范围之内。为什么bar[0]+=1虽然会抛出同样的错误?

+0

因为'bar [0]'是一个读取'bar'的表达式,这在python中是允许的。 – HuStmpHrrr 2015-03-02 21:10:24

回答

1

当你执行的代码,你会得到

.... 
    foo += 1 
UnboundLocalError: local variable 'foo' referenced before assignment 

foo += 1实际上是这样评价。 foo = foo + 1。因此,您将1添加到foo的值并将其存储在变量foo中。由于有一个任务发生,Python假设foo是一个局部变量。但是,如果它是一个局部变量,则在表达式foo + 1中,foo的值是多少? Python无法回答这个问题。这就是为什么它会抛出这个错误。

但是,当你做bar[0] += 1时,Python会像这样评估它bar[0] = bar[0] + 1。因为它已经知道bar是什么,而你只是试图替换它中的第一个元素,它允许它。在最后一种情况下,我们通过做foo += 1来创建一个新的局部变量foo,但在这里,我们只是改变了同一个对象。所以Python允许这样做。

1

变量foo指向一个对象(一个整数)。变量baz指向一个对象(一个列表)。如果您尝试将baz重新分配给另一个对象,则会出现错误。但你不是,你只是在列表对象上调用一个方法,任何人都可以做到这一点。

1

在python中,你不能修改没有'global'关键字的全局变量。这是为了清楚。由于bar [0] + = foo修改列表的一个元素,而不是列表变量本身的值,所以它是合法的。