なぜ地球上でPythonは関数内でグローバル宣言リストを変更できないのですか?グローバルを変更してもエラーが発生しないのはなぜですか?
RE-UPDATED私はそのライン前に、同じ名前の変数にアクションをassignementを置く場合
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]
"""
はない追加された行(バイトコードコンパイラスポット、それを、私は推測)、エラーになります。
スコープ規則について混乱しているようです。これについていくつかの質問がありますが、SOの向こう側に広がっている質の高い回答があり、docs.python.orgでもこれをカバーしています。 – delnan
私はまだこれが些細なものではないと思います。私は多くのことを学び、教師であり、1984年からコンピュータサイエンスを学んだドキュメンテーションからはっきりとは思えません。 –
私は1つと思っています - ほとんどの言語ではスコープルールよりも複雑です厄介な例外を除いて、一握りのルール。 – delnan