我已经阅读了其他一些SO(PythonScope和globals don't need 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
中的baz()
需要被视为局部变量,因此+=
不能被隐式转换为extend()
以使其识别全局变量?
+=
不会隐式调用extend()
。首先,它是augmented assignment operator。