为了加强理解,做了一些类比试验
Topic source看了楼主这个终于理解了
def createCounter(): n = 0 def counter(): nonlocal n n += 1 return n return counter
这段代码如果不加nonlocal,会报错,这是因为对于fun1函数,x是局部变量,对于fun2函数,n是非全局的外部变量。当在fun2中对n进行修改时,会将n视为fun2的局部变量,屏蔽掉fun1中对n的定义;如果仅仅在fun2中对n进行读取,则不会出现这个错误。
而写成列表则不会报错,reason楼主写的很清楚了
def createCounter(): L = [0] # 列表L的内存地址在初次调用时已经给定,且L[0]即第一个元素指向整数0 def counter(): L[0] += 1 # 改变列表L中第一个元素的值,但并没有改变列表L的内存地址 return L[0] return counter
- 1
梦想家高先森