第五季 发表于 2020-6-26 16:11:18

可以解释一下这段代码吗 为啥结果是678

def funX():

    x = 5

    def funY():

      nonlocal x

      x += 1

      return x

    return funY



a = funX()

print(a())

print(a())

print(a())

Twilight6 发表于 2020-6-26 16:26:41

本帖最后由 Twilight6 于 2020-6-26 16:29 编辑

def funX():
    x = 5

    def funY():
      nonlocal x
      x += 1
      return x

    return funY

a = funX()

当你调用 a = funX() 时候,返回的是 funY而你 funX() 函数设置的返回值就是 funY 这里没带括号,是返回的一整个函数体,也就是 funY函数

所以这里实际上你一调用完 funX() 时候a就等于了 funY,即 a = funY (没带括号,是指这个函数),这个时候 x 相对于a 来说是个全局变量,也就是函数可以看成是这样的:

def funY():
      nonlocal x
      x += 1
x = 5
a = funY


而你每次 a() 都是等于调用了一次 funY() 导致每次调用 x 都 + 1 ,所以每次调用 a() 的值都是不一样的

你要记着,当函数名带上括号就是调用这个函数,返回的是函数运行的结果

而只有函数名时候,相当于是把这个函数赋值给了一个变量,这个变量就是这个函数的 别名,也可以说是外号~

当你调用这个变量时候,实际上就是在调用赋值的函数体本身

第五季 发表于 2020-6-26 16:43:46

Twilight6 发表于 2020-6-26 16:26
当你调用 a = funX() 时候,返回的是 funY而你 funX() 函数设置的返回值就是 funY 这里没带括号,是 ...

答得真好啊

Twilight6 发表于 2020-6-26 16:46:19

第五季 发表于 2020-6-26 16:43
答得真好啊

{:10_297:}谢谢
页: [1]
查看完整版本: 可以解释一下这段代码吗 为啥结果是678