总结:

  • 内部函数,ä¸�修改全局å�˜é‡�å�¯ä»¥è®¿é—®å…¨å±€å�˜é‡�
  • 内部函数,修改å�Œå��全局å�˜é‡�,则python会认为它是一个局部å�˜é‡�
  • 在内部函数修改å�Œå��全局å�˜é‡�之å‰�调用å�˜é‡�å��称(如print sum),则引å�‘Unbound-LocalError

在程�中设置的 sum 属于全局��,而在函数中没有 sum 的定义,根�python访问局部��和全局��的规则:当�索一个��的时候,python先从局部作用域开始�索,如果在局部作用域没有找到那个��,那样python就在全局��中找这个��,如果找�到抛出异常(NAMEERROR或者Unbound-LocalError,这�决于python版本。)

如果内部函数有引用外部函数的����或者全局��,并且对这个��有修改.那么python会认为它是一个局部��,�因为函数中没有sum的定义和赋值,所以报错。

从下�两个程�看�独的访问或者修改全局��,并�报错~

访问全局��:

#!/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

原文地�:https://blog.csdn.net/my2010sam/article/details/17735159