Python爲什麼在函數中改變不是全局聲明列表?爲什麼改變全球不會給錯誤?
RE更新的
numbers = []
num = 4
def add(n, thisnum=None):
# changing global list without global declaration!
numbers.append(n)
if thisnum:
num = thisnum
print 'num assigned', thisnum
##numbers = ('one', 'two', 'three')
## adding this line makes error:
"""Traceback (most recent call last):
File "J:\test\glob_vals.py", line 13, in <module>
add(i)
File "J:\test\glob_vals.py", line 6, in add
numbers.append(n)
UnboundLocalError: local variable 'numbers' referenced before assignment
"""
for i in (1,2,3,564,234,23):
add(i)
print numbers
add(10, thisnum= 19)
# no error
print num
# let the fun begin
num = [4]
add(10, num)
print num
# prints:
"""[1, 2, 3, 56, 234, 23]
num assigned 19
4
num assigned [4]
[4]
"""
如果我把assignement變量同名那麼行動該行之前成爲錯誤,而不是添加的行(字節碼編譯點吧,我猜)。
您似乎對範圍規則感到困惑。有一些關於這個問題的質量問題遍佈於SO,docs.python.org也涵蓋了這一點。 – delnan 2010-12-11 17:18:30
我仍然認爲這不是微不足道的事情,或者從我已經學習很多的文檔中看得很清楚,自1984年以來一直擔任老師和學習計算機科學。 – 2010-12-11 17:33:26
我認爲這很簡單 - 或許比大多數語言的範圍規則更復雜,但仍然只有一個少數規則沒有討厭的例外。 – delnan 2010-12-11 17:55:18