Python + =与.extend()在全局变量上的函数内

问题描述 投票:6回答:2

我已经阅读了其他一些SO(PythonScopeglobals 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()以使其识别全局变量?

python methods global operator-keyword
2个回答
4
投票

+=不会隐式调用extend()。首先,它是augmented assignment operator


0
投票
[更改列表时,您应该说全局myList。变异是指更改参考。第一个示例和第三个示例基本相同,只用+ =表示速记
© www.soinside.com 2019 - 2024. All rights reserved.