まとめ:

  • 内部関数は、グローバル変数を変更しなければグローバル変数にアクセスできる
  • 内部関数が同名のグローバル変数を変更すると、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