尽管给出了两个 return 关键字,Python 函数也不会抛出错误

ivb*_*tar -2 python

我在代码审查中看到了下面的代码。Python 3.9。

def choice():
    x = "Xamaro"
    return x
    y = "Camaro"
    return y
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它不会抛出任何错误。所以我认为它返回 2 个值。所以我尝试获取如下返回值。

a, b = choice()
print(a,b)
Run Code Online (Sandbox Code Playgroud)

但它会抛出错误: ValueError: 太多值无法解压 (预期 2)

如果我尝试下面的代码,它会毫无错误地打印“Xamaro”。

a = choice()
print(a)
Run Code Online (Sandbox Code Playgroud)

所以看起来它正在获取第一个返回值。但为什么它不会为 y 的第二个返回值抛出错误。python中这种双返回用法有具体的使用场景吗?

che*_*ner 5

我也很好奇为什么当第二个显然无法访问时它不会抛出错误。

编译器可以简单地消除错误,而不是抛出无法访问的代码错误。

>>> def choice():
...     x = "Xamaro"
...     return x
...     y = "Camaro"
...     return y
...
>>> import dis
>>> dis.dis(choice)
  2           0 LOAD_CONST               1 ('Xamaro')
              2 STORE_FAST               0 (x)

  3           4 LOAD_FAST                0 (x)
              6 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

(更聪明的编译器可以注意到 store 和generate 之后的立即加载LOAD_CONST 1; RETURN_VALUE,但 CPython 显然不会努力执行此类优化。)

这并不是说 Python 将消除所有死代码,但这也意味着该语言也不会致力于检测它们。函数的主体只是有效语句的列表,而不用担心每个这样的列表是否有意义,并且保留它可以简化解析器和代码生成器。