asa616628217 发表于 2021-8-28 11:09:16

闭包的疑惑

def a():
        x=5
        def b():
                return x
        return b()


这个不会出错!这个不是闭包吗??
def a():
        x=5
        def b():
                x+=1
                return x
        return b()
为啥出错了

闭包只有在运算是才算吗??

青出于蓝 发表于 2021-8-28 11:12:46

def a():
      x=5
      def b(x):
                x+=1
                return x
      return b(x)
print(a())

青出于蓝 发表于 2021-8-28 11:13:32

变量x不在函数b内,无法直接修改,要通过函数参数传进去

逃兵 发表于 2021-8-28 11:20:35

主要是因为没有让解释器清楚变量x是全局变量还是局部变量

在函数内部对变量x赋值进行修改后,变量x就会被Python解释器认为是局部变量而非全局变量

sunrise085 发表于 2021-8-28 11:25:46

本帖最后由 sunrise085 于 2021-8-28 11:29 编辑

这个问题问的好。
其实你这是两个问题。

第一,这不是闭包。函数a返回的是b()是调用函数b的结果,而不是返回函数b本身。所以这不是闭包

第二,你这个问题其实是变量作用域的问题。
         第一种写法,在函数b中没有重新定义同名局部变量x,仅仅是使用了x,会在上一层去寻找x。
         第二种写法,在函数b中修改了变量x,但是有没有发现定义局部变量x也没有global声明为外部x,所以就报错了。
可以去看看我的一个有关于作用域帖子:Python细节之7、global 与 nonlocal 的使用
若对作用域有一些了解,可以重点看一下第四部分。

asa616628217 发表于 2021-8-28 16:47:57

青出于蓝 发表于 2021-8-28 11:13
变量x不在函数b内,无法直接修改,要通过函数参数传进去

大神这个需要什么参数传进去能举个例子吗?》

asa616628217 发表于 2021-8-28 16:50:53

逃兵 发表于 2021-8-28 11:20
主要是因为没有让解释器清楚变量x是全局变量还是局部变量

在函数内部对变量x赋值进行修改后,变量x就会 ...

大神 这个x本来不就是局部变量吗 ?

逃兵 发表于 2021-8-28 16:55:18

asa616628217 发表于 2021-8-28 16:50
大神 这个x本来不就是局部变量吗 ?

x是a的局部变量
b在a的内部
所以x相当于b的全局变量

asa616628217 发表于 2021-8-28 17:26:48

逃兵 发表于 2021-8-28 16:55
x是a的局部变量
b在a的内部
所以x相当于b的全局变量

谢谢大神
再问一个问题
def a():
        x=3
        def b():
                print(x)
                return x+1
        b()
a()返回结果为什么是一个4
def a():
        x=3
        print(x)
        return x+1
a() 为什么这个返回两个结果 34
第一个函数里边b() 不应该就是两个结果吗?

逃兵 发表于 2021-8-28 17:29:53

def a():
      x=3
      def b():
                print(x)
                return x+1
      b()


这段代码,a没有返回值,只是在a中执行一次b,b的内容是打印,所以只有3

def a():
      x=3
      print(x)
      return x+1
这段代码,先打印,然后返回

asa616628217 发表于 2021-8-28 18:07:23

逃兵 发表于 2021-8-28 17:29
这段代码,a没有返回值,只是在a中执行一次b,b的内容是打印,所以只有3




谢谢大神 有点深奥!
def a():
      x=3
      def b():
                print(x)
                return x+1
      b()
这个函数a()不就是返回函数b()吗

def a():
      x=3
      def b():
                print(x)
                return x+1
       returnb()
下边这个就有两个了 ? 这个返回的为什么是b()函数里的值?

逃兵 发表于 2021-8-29 08:10:31

asa616628217 发表于 2021-8-28 18:07
谢谢大神 有点深奥!
def a():
      x=3


return才是返回
没有return只是执行,但是不接收返回的数据

上面的函数a没有return,所以没有返回值
下面的a有return,返回b(),而b()的return为x+1
a就是return   b的return 值

asa616628217 发表于 2021-8-29 12:49:16

逃兵 发表于 2021-8-29 08:10
return才是返回
没有return只是执行,但是不接收返回的数据



谢谢 大神!
页: [1]
查看完整版本: 闭包的疑惑