当前位置: 首页 > 知识库问答 >
问题:

javascript - 为什么 python 闭包在第一种情况下无法输出内容,而第二种可以?

符修杰
2024-08-07


为何第一种无法输出内容呢,但是第二种可以。这个闭包操作学的很蒙

希望可以被解决,在下为新手,谢谢

共有2个答案

萧煜
2024-08-07

这跟闭包不闭包没关系。第一种你返回的是一个函数、可你也没调用这个函数啊,当然没有输出了。

image.png

要想有输出你也得是:

...
startgame(fps)()
凌联
2024-08-07

解释

在 Python 中,闭包(Closure)是一种特殊的函数,它记住了其外部作用域中的变量,即使外部函数已经执行完毕。闭包通常用于创建具有私有数据(即外部函数中定义的变量)的函数。

在你提供的图片中,展示了两种使用闭包的例子,但只给出了代码的一部分,没有完整的上下文(如函数调用等),不过我可以根据通常的情况来解释为何一种能输出而另一种不能。

第一种情况无法输出的可能原因:

  1. 变量作用域和修改问题:如果外部函数中的变量在内部函数被调用前就被修改了,或者根本就没有被正确地传递到内部函数的作用域中,那么内部函数可能无法访问到预期的值。
  2. 内部函数未被调用:如果仅定义了闭包(即内部函数),但没有在外部函数外部调用它,那么它自然不会执行任何输出。
  3. 逻辑错误:在内部函数中可能存在逻辑错误,比如条件判断导致不执行输出语句,或者输出语句本身就有误。

第二种情况能输出的原因:

  1. 变量正确传递:在第二种情况中,外部函数中的变量被正确地传递到了内部函数的作用域中,并且这些变量在内部函数被调用时是可用的。
  2. 内部函数被调用:与第一种情况不同,这里的内部函数在外部函数外部被正确调用,从而执行了输出语句。
  3. 逻辑正确:内部函数中的逻辑确保了在满足条件时会执行输出语句。

示例代码分析

假设两种情况的简化代码如下:

第一种情况(可能无法输出)

def outer():
    x = "Hello"
    def inner():
        # 如果x在这里被修改或者未正确使用,则不会输出
        print(x)  # 如果x在这里不可见或已被修改,则不会输出
    # 注意:这里没有调用inner(),只是定义了它

outer()  # 只会执行outer(),不会调用inner()

第二种情况(能输出)

def outer():
    x = "Hello"
    def inner():
        print(x)  # x是可见的,因为inner是闭包
        return x
    return inner  # 注意这里返回了inner函数

my_closure = outer()  # 调用outer(),返回inner函数
my_closure()  # 现在调用inner(),输出"Hello"

在第二种情况中,outer() 被调用并返回了 inner 函数(即闭包),然后 inner() 被调用,从而输出了 "Hello"。在第一种情况中,inner() 根本就没有被调用,因此不会输出任何内容。

 类似资料:
  • 本文向大家介绍请解释下为什么下面第一种方式会报错而第二种不会?相关面试题,主要包含被问及请解释下为什么下面第一种方式会报错而第二种不会?时的应答技巧和注意事项,需要的朋友参考一下 object的键会被自动转为字符串。 但是 属性名只能是字符串,不能是数字, 因为会被当成小数点。 第一种可以使用 第二种会被转成字符串所以不会报错。

  • 第二种情况有什么问题? 未捕获的TypeError:x.toLocaleUpperCase在HtmlButtoneElement的f(:2:14) 在:5:25 处不是函数。执行按钮。onclick

  • 问题内容: 我有两个例子: 范例1: 范例2: 在 第二个 例子不工作,我想它做的事。我的意思是文件内容不为空,但好像zip文件已损坏。 我想告诉我第一个例子为什么不起作用。 问题答案: 必须在流的末尾执行多项操作以完成zip文件,因此必须正确关闭它。(一般来讲,按照惯例,每个流几乎都 应该 正确关闭。)

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 我已阅读以下讨论: 如果私有帮助器方法可以是静态的,则它们应该是静态的;如果它们的类没有成员变量,则所有方法应该是静态的。 似乎人们通常会接受静态方法,但由于以下两个原因,对此有些怀疑: 他们很难测试。 他们违反了OO原则。(一个人说,它们是函数,而不是方法。) 最可接受的静态方法是 私有静态 方法。但是,为什么为什么根本不存在静态方法呢?在什么情况下,它们是最优先采用的方法? 问题答

  • 问题内容: 我偶然发现该语句(从一些更复杂的代码中摘录)进行编译: 在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾: 该块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?) 问题