【问题标题】:Python ternary object attribute evaluated out of order?Python三元对象属性评估乱序?
【发布时间】:2022-01-08 16:51:25
【问题描述】:

我对使用 Python 比较陌生,前几天在 Leetcoding 时发现了一些奇怪的东西。我用 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

【问题讨论】:

  • 你从哪里得到第一个语法?这不是三元条件在 python 中的工作方式。您的代码正在使用(a.val,0) 创建一个元组。这就是错误。改用这个b = a.val if a is None else 0
  • @Adithya 这是来自stackoverflow.com/a/470376/446792 的老把戏,这是一种不起作用的情况
  • 谢谢.. 认为这是一个技巧。没想到新手是从聪明的代码开始的。 ;)
  • 问题是 b 首先创建一个元组,然后它执行 [a is None] 部分......我们知道 a.val 是未定义的,所以它会导致错误。检查我的答案以获得解释!

标签: python tuples ternary


【解决方案1】:

好的,所以第二个有效的原因是因为 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'

Nonetype 没有.val,所以我不确定你是从哪里得到的?

a = None
print(a.val)

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

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

(我会假设 a.val 可能是一个类?)

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 是未定义的,所以它会自动给你一个属性错误。所以索引部分不是错误。这是你的元组部分。

希望这是有道理的!

【讨论】:

  • 感谢@Srishruthik。但在第一个中,b 不应该解析为 0,因为语法是:(if_test_is_false, if_test_is_true [test] 那么它不应该评估 a.val 对吗? https://book.pythontips.com/en/latest/ternary_operators.html
  • 不,如果您考虑一下,您正在创建一个元组......所以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]... 在第一个语句中(b = (a.val,0) 它给出了 u 和错误,因为它无法评估 a.val 希望这使得感觉!
  • 哦。好,很好。谢谢!
猜你喜欢
  • 2012-02-25
  • 2010-11-27
  • 1970-01-01
  • 2017-01-28
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2018-02-12
相关资源
最近更新 更多