总结:
- 内部函数,�修改全局���以访问全局��
- 内部函数,修改��全局��,则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
点我分享笔记