Python 3中的列表范围

时间:2015-03-02 21:06:33

标签: python list scope

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

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

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

我理解为什么foo += 1会因foo超出本地范围而引发错误。为什么不会bar[0]+=1抛出相同的错误?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在python中,你不能在没有全局'的情况下修改全局变量。关键词。这是为了清楚起见。

foo=1
def bar():
     global foo
     foo=2
bar()
#foo is now 2!

由于bar [0] + = foo修改了列表的元素,而不是列表变量本身的值,因此它是合法的。

答案 2 :(得分: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创建了一个名为foo += 1的新局部变量,但在这里,我们只是在改变同一个对象。所以Python允许这样做。