我讀過其他一些SO(PythonScope和globals don't need global),但沒有任何內容似乎可以解釋得如我所願,並且我在思考過程中遇到了麻煩通過與否PyDocs告訴我,回答我的問題:Python + =與.extend()在一個全局變量上的函數內
myList = [1]
def foo():
myList = myList + [2, 3]
def bar():
myList.extend([2, 3])
def baz():
myList += [2, 3]
現在,可以理解,
>>> foo()
UnboundLocalError
和
bar() # works
myList # shows [1, 2, 3]
但隨後
>>> baz()
UnboundLocalError
但是我想,這東西就像+=
隱式調用的方法運營,在這種情況下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()
,使其識別全局變量?
啊,好的,現在更有意義了,謝謝你的解釋。而且我必須更多地研究一下反彙編器,因爲熟悉這些會幫助我。是的,我不會在實踐中這樣做 - 我犯了一次錯誤,不知道爲什麼我得到了這個輸出,所以我很好奇,但後來做了正常的事情,只是作爲參數傳遞它。謝謝! – dwanderson 2013-04-21 15:22:59