我在代码审查中看到了下面的代码。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中这种双返回用法有具体的使用场景吗?
我也很好奇为什么当第二个显然无法访问时它不会抛出错误。
编译器可以简单地消除错误,而不是抛出无法访问的代码错误。
>>> 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 将消除所有死代码,但这也意味着该语言也不会致力于检测它们。函数的主体只是有效语句的列表,而不用担心每个这样的列表是否有意义,并且保留它可以简化解析器和代码生成器。
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |