【问题标题】:Does python treat no return statement the exact same as return None?python 是否将 no return 语句视为与 return None 完全相同?
【发布时间】:2020-04-22 19:12:02
【问题描述】:

代码:

def foo():
    if condition:
        return some_value
    return None

def bar():
    if condition:
        return some_value

如果条件为假,这两个都返回 None,但是它们在计算时间或其他方面是否有所不同?一般首选哪一个

【问题讨论】:

  • 我希望它们产生相同的字节码,您可以使用dis.dis(foo)dis.dis(bar) 进行检查。
  • 如果它回答了您的问题,请不要忘记接受答案。

标签: python return python-internals


【解决方案1】:

在当前版本的 CPython 中,return None 与根本不返回完全相同。两者都被编译成两个字节码,一个LOAD_CONST 字节码(用于加载None)和一个RETURN_VALUE(用于返回)。

您可以通过使用dis 模块反汇编您编写的两个函数来看到这一点:

>>> import dis
>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (condition)
              2 POP_JUMP_IF_FALSE        8

  4           4 LOAD_GLOBAL              1 (some_value)
              6 RETURN_VALUE

  5     >>    8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

>>> dis.dis(bar)
  8           0 LOAD_GLOBAL              0 (condition)
              2 POP_JUMP_IF_FALSE        8

 10           4 LOAD_GLOBAL              1 (some_value)
              6 RETURN_VALUE
        >>    8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

唯一的区别是bar 的行数更少(如第一列所示),因为隐含的return 与源代码中的任何行都不对应。

然而,它们相同的事实是一个实现细节。其他 Python 解释器,甚至可能包括其他版本的 CPython,可能会针对这两种情况生成不同的代码。

即使实现是相同的,显式的return None 也可能让那些阅读你关心返回值的代码的人更清楚。依赖隐式返回值表明您不关心返回值,并且调用该函数主要是因为它的副作用(例如打印某些东西,或在适当位置改变某些对象)。

在你完全忘记你是如何编写这个函数的之后,阅读你的代码的人可能是你。编写清楚自己在做什么的代码通常比编写能够正确编译和运行的代码更难。

【讨论】:

  • 我什至认为returnreturn None 有不同的情况,根本没有return 的区别; return None 当返回值,甚至 None,预计会被使用(通常有其他返回类型的代码路径)时,普通的 return 用于“在函数结束之前退出,但没有有意义的返回”(没有其他返回类型),根本没有 return 用于“在没有有意义的返回的函数末尾退出”(没有其他返回类型)。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 2018-10-29
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2018-12-08
相关资源
最近更新 更多