Python:赋值中的异常

时间:2011-12-13 16:59:23

标签: python exception exception-handling

如果我尝试以下代码(在Python 3.2.2中),

def f():
    raise Exception

x = f()

然后似乎x未受影响 - 它要么保持未定义,要么保留它之前的任何值。只要赋值的右侧抛出异常,这种行为是否得到保证?我意识到这是一个非常基本的问题,但我找不到有关分配工作原理的详细信息。更一般地说,在与任务相关的任何事情发生之前,是否总是评估整个右侧?当使用setattr,分配列表元素或使用元组解包(即x, y = y, f()之类的东西)时,这是否正确?

2 个答案:

答案 0 :(得分:13)

Python语言参考指定了:

http://docs.python.org/reference/expressions.html#evaluation-order

  

Python从左到右评估表达式。请注意,在评估分配时,右侧会在左侧之前进行评估。

评估右侧,然后是左侧,然后分配本身发生。因此,

def x():
    print "x"
    fail()

def y():
    print "y"
    fail()

x().a = y()

保证打印“y”并因NameError而失败;它永远不会提出“x”,或尝试任何转让。

答案 1 :(得分:0)

关于assignment statement的Python文档没有明确说明当右侧引发异常时,从未触及赋值的左侧,但在阅读本文之后,似乎证明了避免分配的唯一方法是引发异常。

结论:如果引发异常,则永远不会触及作业的左侧