闭包的疑惑
def a():x=5
def b():
return x
return b()
这个不会出错!这个不是闭包吗??
def a():
x=5
def b():
x+=1
return x
return b()
为啥出错了
闭包只有在运算是才算吗?? def a():
x=5
def b(x):
x+=1
return x
return b(x)
print(a())
变量x不在函数b内,无法直接修改,要通过函数参数传进去 主要是因为没有让解释器清楚变量x是全局变量还是局部变量
在函数内部对变量x赋值进行修改后,变量x就会被Python解释器认为是局部变量而非全局变量 本帖最后由 sunrise085 于 2021-8-28 11:29 编辑
这个问题问的好。
其实你这是两个问题。
第一,这不是闭包。函数a返回的是b()是调用函数b的结果,而不是返回函数b本身。所以这不是闭包
第二,你这个问题其实是变量作用域的问题。
第一种写法,在函数b中没有重新定义同名局部变量x,仅仅是使用了x,会在上一层去寻找x。
第二种写法,在函数b中修改了变量x,但是有没有发现定义局部变量x也没有global声明为外部x,所以就报错了。
可以去看看我的一个有关于作用域帖子:Python细节之7、global 与 nonlocal 的使用
若对作用域有一些了解,可以重点看一下第四部分。 青出于蓝 发表于 2021-8-28 11:13
变量x不在函数b内,无法直接修改,要通过函数参数传进去
大神这个需要什么参数传进去能举个例子吗?》
逃兵 发表于 2021-8-28 11:20
主要是因为没有让解释器清楚变量x是全局变量还是局部变量
在函数内部对变量x赋值进行修改后,变量x就会 ...
大神 这个x本来不就是局部变量吗 ?
asa616628217 发表于 2021-8-28 16:50
大神 这个x本来不就是局部变量吗 ?
x是a的局部变量
b在a的内部
所以x相当于b的全局变量
逃兵 发表于 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() 不应该就是两个结果吗?
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
这段代码,先打印,然后返回 逃兵 发表于 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()函数里的值?
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 值 逃兵 发表于 2021-8-29 08:10
return才是返回
没有return只是执行,但是不接收返回的数据
谢谢 大神!
页:
[1]