【问题标题】:"pass" same as "return None" in Python?“通过”与Python中的“返回无”相同吗?
【发布时间】:2026-01-30 19:05:02
【问题描述】:

我已经学习python大约一周了,下面是问题:

代码

def Foo():
    pass

def Bar():
    return None

用法

a = Foo()
print(a)
# None
b = Bar()
print(b)
# None

问题: 1. 既然已经有return None,为什么还要pass?是否有一些场景 return None 无法处理而 pass 可以?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    pass 是一个“空”命令,但return 停止函数/方法。

    例子:

    def func():
        do_something()      #executed
        pass
        do_something_else() #also executed
    

    但是:

    def func2():
        do_something()      #executed
        return None
        do_something_else() #NOT executed
    

    在第二种情况下,return None 是:“停止函数并返回 None”。 但是pass 就像“转到下一行”

    【讨论】:

      【解决方案2】:

      在 Python 等语言中,有两种类型的“事物”被评估:表达式和语句。表达式是,嗯,表达式,它评估 的东西。例如,11+1f(x) 都是表达式,对某物求值。

      相比之下,语句并没有“返回”任何东西,而是“作用于环境”。例如,x=3 将变量 x 设置为值 3def f(x): return x + 1f 的值设置为一个函数。这不会“评估”任何东西,它会修改评估事物的当前环境。

      考虑到这一点,您有时需要一个空语句。出于句法原因,在 Python 中有些地方需要语句,但如果你不想在这里发生任何事情,你可能想要表达所发生的事情恰恰是“什么都没有”。一种方法是对表达式求值,然后什么也不做:

      def f():
          1
      

      但随便看一眼,可能会发现这个函数返回 1: 相反,你可以使用pass 作为明确 声明:'什么都不做':

      def f():
          pass
      

      现在,还有一个问题:我之前提到f(x) 是一个表达式。但是在上面的两个例子中,我没有放任何return,那么这些评估是什么?答案是:除非另有说明,否则函数调用返回(即计算结果为)None。所以:

      def f():
          pass
      
      def g(x):
          if x > 2:
              return x
      
      def h():
          return None
      
      f() # None
      g(3) # 3 -> we explicitely say `return x`
      g(1) # None -> no return specified for that path
      h() # None -> we explicitely say `return None`
      

      其他人提到 pass 可以在其他地方使用(例如在空类中,在异常处理中......)。这样做的原因是所有这些都需要 some 语句,而pass 允许指定一个空的。这一点,再加上函数返回 None(除非另有说明)这一事实,会导致您观察到的行为(尽管它们在概念上有所不同)。

      【讨论】:

        【解决方案3】:

        应该回答这两个问题的示例:

        pass 可用于异常处理:

        try:
            something()
        except:
            pass  # does not return
        this_still_executes()
        

        Pass 可用于声明没有任何新元素的类:

        class CustomError(Exception):
            pass
        

        【讨论】:

        • 我发现 val 的答案更详尽,我希望我能同时接受这两个答案,赞成。
        【解决方案4】:

        最后,Python return None 中的所有函数/方法/可调用对象,除非您手动返回任何其他值,当然。您可以想象每个函数在您的所有自定义代码之后都有一个隐含的return None 语句。如果您使用自己的 return 语句提前退出该函数,它根本无法到达并且没有任何效果。此外,没有值的裸 return 会自动返回 None 作为默认值。


        在这种语言中需要pass 语句(“什么都不做”),因为我们使用不同的缩进级别定义代码块,而不是使用括号(例如 C、Java 等中的 { ... })或关键字(例如if ... fi 在 Bash 中)。

        因此,如果您在某处需要一个空代码块(尚未执行任何操作的函数、空类、空异常捕获器,...),在其他语言中,您只需在开始和结束括号或关键字之间放置任何内容。在 Python 中,你需要一段缩进的代码,否则就是语法错误。因此我们有pass - 尽管我们必须在那个地方编写代码,但什么也不做。

        一些例子:

        • class MyPersonalException(Exception):
              # simple exception without any additional information or functionality
              # 'return None' would not work.
              pass
          
        • def lazy_function():
              # too lazy to do anything...
              # often used if a method needs to be implemented to match an interface,
              # but should not do anything.
              # 'return None' would work here as well.
          
        • try:
               # [do something here]
          catch:
               # we don't have to do anything if it fails, just catch and suppress the exception
               pass
          

        所以pass 只是意味着什么都不做,继续处理下一行。


        总结:

        return None 总是(或可以想象)隐式添加到每个函数定义的最后一行下方。它也可以只出现在函数中并立即退出,返回一个值(或默认为None)。

        pass 没有语义意义,它不会以任何方式被解释。它的唯一目的是允许创建空代码块,这在 Python 中是不可能的,因为我们不使用括号等来包围块。它可以写在任何地方,而且总是一样的:什么都没有。

        【讨论】:

          【解决方案5】:

          另一种情况是pass 表示某事目前尚未实施,但将来会实施。例如,在编写实际逻辑之前,您定义了一些 API:

          def get():
              pass
          
          def post():
              pass
          
          def put():
              pass
          
          ...
          

          这个语义不能被return None代替。就像 viraptor 所说,如果你使用 return None 而不是 pass,有时你会遇到语法错误。

          【讨论】:

            【解决方案6】:
            >>> import dis
            >>> dis.dis(Foo)
              2           0 LOAD_CONST               0 (None)
                          3 RETURN_VALUE        
            
            >>> dis.dis(Bar)
              2           0 LOAD_CONST               0 (None)
                          3 RETURN_VALUE        
            

            如您所见,这些是完全相同相同的功能。没有理由使用一个而不是另一个(在这个具体的例子中)除了样式,也许是为了告诉其他编码人员这个函数的意图是什么。

            一般来说还是有区别的。 return 语句会中断当前函数的执行,而pass 不会。

            【讨论】: