まとめ:
- 内部関数は、グローバル変数を変更しなければグローバル変数にアクセスできる
- 内部関数が同名のグローバル変数を変更すると、pythonはそれをローカル変数とみなす
- 内部関数で同名のグローバル変数を変更する前に変数名を呼び出すと(例:print sum)、UnboundLocalErrorが発生する
プログラムで設定された sum はグローバル変数に属し、関数内には sum の定義がない。pythonがローカル変数とグローバル変数にアクセスする規則によると:変数を検索するとき、pythonはまずローカルスコープから検索を始め、ローカルスコープでその変数が見つからなければ、pythonはグローバル変数の中からその変数を探す。見つからなければ例外(NAMEERRORまたはUnboundLocalError、これはpythonのバージョンによって異なる)が発生する。
内部関数が外部関数の同名変数またはグローバル変数を参照し、かつその変数を変更する場合、pythonはそれをローカル変数とみなす。また、関数内にsumの定義と代入がないため、エラーが発生する。
以下の2つのプログラムから分かるように、グローバル変数へのアクセスまたは変更だけではエラーにはなりません。
グローバル変数へのアクセス:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
def add(a=1,b=3):
print a,b
print sum #仅仅访问
add(4,8)
print sum
出力結果は次のとおりです:
4 8 5 5
同名のグローバル変数を変更すると、ローカル変数とみなされる:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
def add(a=1,b=3):
print a,b
#内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量
sum=b+a #在函数内部修改
print sum
add(4,8)
出力結果は次のとおりです:
4 8 12
次のプログラムでは、「内部関数が外部関数の同名変数またはグローバル変数を参照し、かつその変数を変更する場合、pythonはそれをローカル変数とみなします。また、関数内に sum の定義と代入がないため、エラーが発生します」という理由でエラーが発生します:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
def add(a=1,b=3):
print a,b
print sum #内部函数引用同名变量,并且修改这个变量。python会认为它是局部变量。因为在此处print之前,没有定义sum变量,所以会报错(建议与情况一比较,备注:此处只是比上例先print sum)
sum=b+a
print sum
add(4,8)
print sum
エラーメッセージ:
4 8 Traceback (most recent call last): ... ... ... UnboundLocalError: local variable 'sum' referenced before assignment
プログラム内でグローバル変数にアクセスし、かつグローバル変数の値を変更する必要がある場合は、次を使用できます:globalキーワードを使用して、関数内でこの変数がグローバル変数であることを宣言します。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
print '改变之前:sum=',sum
def add(a=1,b=3):
global sum
print 'add 函数中:sum=',sum
sum=b+a
print '函数中改变之后:sum= ',sum
add(4,8)
print '改变之后 sum=',sum
出力結果は次のとおりです:
改变之前:sum= 5 add 函数中:sum= 5 函数中改变之后:sum= 12 改变之后 sum= 12
原文URL:https://blog.csdn.net/my2010sam/article/details/17735159