当我们在解释器中输入以下内容时:
10(b)
Run Code Online (Sandbox Code Playgroud)
我们得到一个未定义 b 的 NameError。但是,当我们尝试:
10(4)
Run Code Online (Sandbox Code Playgroud)
现在,我们得到了 int 不可调用的错误信息。为什么 Python 在上面的第一种情况下没有给出相同的错误,因为即使在那里, int 也是不可调用的?换句话说,在第一个片段中,我们有“int not callable”和“NameError”这两个错误。如果 Python 从左到右扫描,它首先会看到对 int (10) 执行的调用操作。所以它也应该为第一个给出“int not callable”错误。为什么没有?
我认为这可能是因为它首先评估括号内的表达式。但是,当我们尝试这样做时:
f(print("Hello"))
Run Code Online (Sandbox Code Playgroud)
现在,它说 NameError 没有定义 f。它甚至不打印“你好”。所以这表明我们对带括号的表达式求值的假设似乎不成立。
那么它究竟是如何工作的呢?
您只是在执行具有运行时错误的有效表达式。代码按照规定的求值顺序执行,运算符根据其优先级执行。在每个表达式中,您需要检查该特定操作的文档以查看操作的各个部分的执行顺序。
在所有三种情况下,您都要求 Python 执行call,其中记录了规则:
主要必须评估为可调用对象[.] 在尝试调用之前评估所有参数表达式。
可调用对象首先被评估为一个对象,并10成功执行以生成一个对象。在对参数表达式求值之前,不会尝试调用。
参数表达式是组成要传递给调用的值的表达式,(...). 只有在评估了这些表达式后,才会进行调用。
您的第一个示例给出了一个NameError异常,因为b表达式评估失败。Python 永远不会执行调用,因为参数表达式的计算失败了。
在您的第二个示例中,参数表达式是4,一个成功的有效表达式,因此只有这样 Python 才能继续执行调用。但10不可调用,因此这是下一次失败。
最后一个示例在f表达式的开头就失败了,因为 Python 首先评估了可调用部分,但由于未定义名称而无法加载可调用部分。
对于其他运算符,不同的评估顺序规则适用,您必须检查该特定运算符的文档以查看组件部分将按什么顺序执行。
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |