Python 三元对象属性评估顺序不正确?

Python ternary object attribute evaluated out of order?

我对使用 Python 比较陌生,前几天在 Leetcoding 时注意到了一些奇怪的事情。我 运行 this with Python 3.8 并得到一个对象属性错误。但不应访问该属性,因为条件为真。好像这已经可以回答了,但我找不到重复的问题。谁能帮我指出正确的方向?感谢您的帮助。

#AttributeError: 'NoneType' object has no attribute 'val'
a = None
b = (a.val, 0)[a is None]
#works
a=None
if a is None:
    b=0
else:
    b=a.val

好的,所以第二个起作用的原因是因为 a 设置为 None 并且它转到第一个 if 语句并跳过 else 语句,因为第一个 if 语句为真。如果你说:

a=None
if a is not None:
    b=0
else:
    b=a.val

这会出现错误:AttributeError: 'NoneType' object has no attribute 'val'

None类型没有 .val 所以我不确定你是怎么得到的?

a = None
print(a.val)

AttributeError: 'NoneType' object has no attribute 'val'

无论哪种方式,如果你想要一个三元运算符(顺便说一句,python 中不存在三元运算符),那么类似的方法如下:

(我假设 a.val 可能是 class?)

a = None
b = a.val if a is None else 0

之所以b = (a.val, 0)[a is None]给你报错是因为

如果您考虑一下,您正在创建一个元组...因此 python 首先创建一个元组,然后再创建 [a is None] 部分。 a.val 是未定义的,所以它会给你一个错误。如果你尝试做 b = (a.val,0) (注意我删除了索引部分)它会给你同样的错误,因为它首先创建了一个元组。

b = (a.val,0)[a is None) 等于:

b = (a.val,0)
b[a is None]

我们知道 a.val 是未定义的,所以它会自动给你一个属性错误..所以索引部分不是错误。这是你的元组部分。

希望这是有道理的!