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 是未定义的,所以它会自动给你一个属性错误..所以索引部分不是错误。这是你的元组部分。
希望这是有道理的!
我对使用 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 是未定义的,所以它会自动给你一个属性错误..所以索引部分不是错误。这是你的元组部分。
希望这是有道理的!