我已经阅读了其他一些 SO(PythonScope和globals 不需要 global),但似乎没有什么能像我想要的那样明确解释,而且我在精神上筛选PyDocs是否告诉我问题的答案时遇到了麻烦:
myList = [1]
def foo():
myList = myList + [2, 3]
def bar():
myList.extend([2, 3])
def baz():
myList += [2, 3]
现在,可以理解的是,
>>> foo()
UnboundLocalError: local variable 'myList' referenced before assignment
和
bar() # works
myList # shows [1, 2, 3]
但是之后
>>> baz()
UnboundLocalError: local variable 'myList' referenced before assignment
但是,我认为,+=
在这种情况下,隐式称为方法运算符之类的东西extend()
,但错误意味着由于某种原因它实际上并未+=
视为extends()
. 这与 Python 解析应该如何工作一致吗?
我会认为调用等效于方法运算符的函数,它们在所有情况下都是等效的。相反,它似乎将其视为+=
实际的赋值运算符。除了,这不完全正确,因为如果我做某事(诚然做作):
myList = range(50000000) # wait a second or two on my laptop before returning
myList += [0] # returns instantly
myList = myList + [1] # wait a second or two before returning
所有这些都是预期的,如果+=
实际上只是调用extend()
.
是否有一些更好的区别(或非常明显的点......)我错过了,这清楚地表明myList
inbaz()
需要被视为局部变量,因此+=
不能隐式转换为extend()
它可以识别全局变量多变的?