python------------------

这里为什么必须返回L[0]才行,或者能不能改一下

def createCounter():
    L = [0]
    def counterA():
        L[0]+=1
        return L[0]
    return counterA

# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')

返回 1,2,3,4,5

1个回答

这是一种元编程(netaprogramming)的手段,通过创建匿名对象,将上层的函数(createCounter)所定义的闭包变量L作为共享变量,起到计数器的作用。
之所以用数组,而不是直接用数字,是因为只有引用类型才能实现这种共享。否则你运行程序会得到一个无初始化引用的错误。

用数组最简单,当然根据这个原理,你传入任何有引用的对象都可以,比如可以这么写:

# -*- coding: UTF-8 -*-
class MyIntRef:
    def __init__(self):
        self.val = 0
    def getval(self):
        return self.val
    def setval(self, x):
        self.val = x

def createCounter():
    L = MyIntRef()
    def counterA():
        L.setval(L.getval() + 1)
        return L.val
    return counterA

# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问