python 循环中的闭包引用该如何理解

一个老生常谈的问题了, 但是还是感觉无法特别清晰的理解, 两段代码如下:

l1 = []

for i in range(3):
    def func():
        return i
    l1.append(func)
    
for f in l1:
    print(f())

上面的代码会输出 3 个 2

如果稍微修改, 如下:

l1 = []

for i in range(3):
    def func(i=i):
        return i
    l1.append(func)
    
for f in l1:
    print(f())

上面代码会输出 0, 1, 2

网上的很多教程都是说, 在往l1中添加func的时候, func并没有保存i的值, 而是当执行f()的时候才取, 此时i已经变成了 2, 但是对于第二段代码, 如果i是以默认参数的形式传递进来, 又该如何解释?

希望可以有前辈指点一二, 不胜感激

阅读 1.8k
1 个回答

第二段代码,你把一个i改成别的,比如改成j,这样你就理解了吧?

for i in range(3):
    def func(j=i):
        return j
    l1.append(func)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题