Killiam 发表于 2020-7-20 21:20:45

零基础python课程第020函数的闭包的问题?

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

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

1q23w31 发表于 2020-7-20 21:26:13

列表是一个全局变量,本质上python中的列表是一个栈,不同于整型变量,所以可以进行引用和修改

Twilight6 发表于 2020-7-20 21:35:51


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

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

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

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

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

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

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

页: [1]
查看完整版本: 零基础python课程第020函数的闭包的问题?