鱼C论坛

 找回密码
 立即注册
查看: 1420|回复: 2

[已解决]零基础python课程第020函数的闭包的问题?

[复制链接]
发表于 2020-7-20 21:20:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码:
def Fun1():
    x =5
    def Fun2():
        x *=x
        return x
    return Fun2()
#Fun1()#会报错,因为Fun2只能调用Fun1中的x,但是不能对其进行修改  

def Fun11():
    x =[5]#列表不是栈,可以
    def Fun22():
        x[0] *=x[0]
        return x
    return Fun22()
Fun11()
结果:[25]
想问一下第一部分的Fun1\2会报错是因为,Fun2 是 Fun1 的内部函数,只能调用x不能修改x  (我的理解但是不知道对不对)
那为什么第二部分的Fun11\22 Fun22就可以修改Fun11的X[]呢?
视频里提及了 容器 ,是因为列表比较特殊吗?具体特殊表现在什么地方呀
最佳答案
2020-7-20 21:35:51

想问一下第一部分的Fun1\2会报错是因为,Fun2 是 Fun1 的内部函数,只能调用x不能修改x  (我的理解但是不知道对不对)?


嗯,不准确,严格来说是因为 Fun2 函数对 x 参数重新赋值,触发屏蔽机制,屏蔽外部的全局变量,导致 你 x *= x 的时候

右边的 x 因为触发屏蔽机制,导致 x 在未定义之前提取调用,导致报错

那为什么第二部分的Fun11\22 Fun22就可以修改Fun11的X[]呢?


容器类型的值是可以对容器内的元素进行改变的,而如果你对容器本身进行赋值就会导致和第一个代码一样的报错

视频里提及了 容器 ,是因为列表比较特殊吗?具体特殊表现在什么地方呀


容器类型简单来理解就是可以装入元素的东西,比如 列表,字典,元组都是容器类型的值

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-20 21:26:13 | 显示全部楼层
列表是一个全局变量,本质上python中的列表是一个栈,不同于整型变量,所以可以进行引用和修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-20 21:35:51 | 显示全部楼层    本楼为最佳答案   

想问一下第一部分的Fun1\2会报错是因为,Fun2 是 Fun1 的内部函数,只能调用x不能修改x  (我的理解但是不知道对不对)?


嗯,不准确,严格来说是因为 Fun2 函数对 x 参数重新赋值,触发屏蔽机制,屏蔽外部的全局变量,导致 你 x *= x 的时候

右边的 x 因为触发屏蔽机制,导致 x 在未定义之前提取调用,导致报错

那为什么第二部分的Fun11\22 Fun22就可以修改Fun11的X[]呢?


容器类型的值是可以对容器内的元素进行改变的,而如果你对容器本身进行赋值就会导致和第一个代码一样的报错

视频里提及了 容器 ,是因为列表比较特殊吗?具体特殊表现在什么地方呀


容器类型简单来理解就是可以装入元素的东西,比如 列表,字典,元组都是容器类型的值

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 01:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表