yz7268913 发表于 2020-7-1 23:10:51

求助

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

a = funX()
print(a())
print(a())
print(a())

funX()能理解,输出就是6,但是print(a()),这代码不明白是什么意思,

a = funX(),表示a是被赋值成一个函数了,还是表示被赋值成函数的输出值?

Twilight6 发表于 2020-7-1 23:13:28

本帖最后由 Twilight6 于 2020-7-1 23:30 编辑



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() 的值都是不一样的

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

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

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

a = funX(),表示a是被赋值成一个函数了,还是表示被赋值成函数的输出值?

综上分析:

a = funX() 等价于 a = funY 函数,因为 funX() 返回结果是个funY 函数体

那么:print(a()) 就是打印 a() 调用后返回的结果,即可看成 print(funY()) ,实际上就是在打印 funY() 函数返回的 x 的值

而且每次调用 funY() 函数都会导致 x + 1,所以每次打印的值都比原先 +1



yz7268913 发表于 2020-7-1 23:55:03

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

那我最后输出部分如果直接这么写是不对的咯?
print(a)
print(a)
print(a)

按照你的意思,a = funY,那a()相当于funY()了是吗

yz7268913 发表于 2020-7-1 23:55:36

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

那我最后输出部分如果直接这么写是不对的咯?
print(a)
print(a)
print(a)

按照你的意思,a = funY,那a()相当于funY()了是吗

Twilight6 发表于 2020-7-1 23:59:01

yz7268913 发表于 2020-7-1 23:55
那我最后输出部分如果直接这么写是不对的咯?
print(a)
print(a)


按照你的意思,a = funY,那a()相当于funY()了是吗

是的,就像普通赋值   x = 1 也就是将 1 取了个别名 x ,这里的 a = funY 也是为函数 funY 取了个别名 a


那我最后输出部分如果直接这么写是不对的咯?

对的,回打印一串英文,也就是 Python 告诉你这个是个函数

页: [1]
查看完整版本: 求助