这可能是一个非常愚蠢的问题,但我对于为什么列表的行为与Python 3中的其他变量的行为有关,关于范围,我有点不确定。在下面的代码...Python 3中的列表范围
foo = 1
bar = [1,2,3,4]
def baz():
foo += 1
bar[0]+=1
我明白为什么foo += 1
抛出关于一个错误foo
是当地的范围之内。为什么bar[0]+=1
虽然会抛出同样的错误?
这可能是一个非常愚蠢的问题,但我对于为什么列表的行为与Python 3中的其他变量的行为有关,关于范围,我有点不确定。在下面的代码...Python 3中的列表范围
foo = 1
bar = [1,2,3,4]
def baz():
foo += 1
bar[0]+=1
我明白为什么foo += 1
抛出关于一个错误foo
是当地的范围之内。为什么bar[0]+=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允许这样做。
变量foo
指向一个对象(一个整数)。变量baz
指向一个对象(一个列表)。如果您尝试将baz
重新分配给另一个对象,则会出现错误。但你不是,你只是在列表对象上调用一个方法,任何人都可以做到这一点。
在python中,你不能修改没有'global'关键字的全局变量。这是为了清楚。由于bar [0] + = foo修改列表的一个元素,而不是列表变量本身的值,所以它是合法的。
因为'bar [0]'是一个读取'bar'的表达式,这在python中是允许的。 – HuStmpHrrr 2015-03-02 21:10:24