Python中的不确定行为

Undefined Behaviour in Python

本文关键字:不确定 Python      更新时间:2023-10-16

in c c 我知道有东西叫做

未定义的行为

当某些表达式具有副作用时,

在表达评估中。假设我想计算以下内容:

c = 10
f() + g() + c

,但在某个时候G使C =5。(C是Glob变量(

python的行为是什么?它会不确定为 c

python文档的6.15

Python评估从左到右的表达式。请注意,在评估作业时,右侧在左侧进行评估。

在以下几行中,表达式将以后缀的算术顺序进行评估:

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)   <----- This is of importance to us.
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

因此,此处将按从左到右按顺序调用功能。因此,您将看到的任何更改都是由于从左到右所调用的功能。

python函数呼叫中的是表达式。

c代码:

#include <stdio.h>
int c;
int f (void)
{
  return 1;
}
int g (void)
{
  return ++c;
}
int main()
{
  c = 3;
  printf("%d", f() + g() + c);
  return 0;
}

do 不是调用未定义的行为。但是,它确实调用了未指定的行为。这些是不同的,正式的术语:未定义,未指定和实施定义的行为

首先请注意,f() + g() + c(f() + g()) + c,但这对术语本身实际上是评估的顺序没有告诉您

此代码的结果可以是1 + (3+1) + 3 = 81 + (3+1) + 4 = 9,具体取决于操作数g()是否在操作数c之前或之后评估。+运算符操作数的评估顺序是未指定的,因此我们不知道首先评估的操作数,也不应该编写依赖于某个顺序的代码。

代码只会给出两个提到的结果中的任何一个,它不会做任何完全疯狂的事情,例如崩溃或给出垃圾结果,哪些包含不确定行为的代码可以做到。不确定行为的一个例子是c++ + c++

示例之间的差异是副作用发生的位置。请参阅未定义的行为和序列点

如果cglobal变量,并且g()将相同的c成为5的值,这意味着这是unspecified behaviour

请注意,Python口译员从左到右评估表达式,这意味着c将其添加到f() + g()

时将为5