【问题标题】:Should these expressions evaluate differently?这些表达式应该以不同的方式计算吗?
【发布时间】:2011-09-23 23:13:41
【问题描述】:

在我发现代码中的错误之前,我有些困惑。我不得不改变

a.matched_images.count #True when variable is 0

a.matched_images.count > 0 #False when variable is 0

因为我很快想知道一个对象是否有任何图像,所以第一个代码将显示为照片有图像,因为当含义真的为假时,表达式计算为 True(“无图像”/0 个图像)

我是否正确理解了这一点,如果这些表达式应该计算为不同的值,请您回答或评论。

【问题讨论】:

  • 如果 a.matched_images.count 是 int 0,那么它应该评估为 False。您可以在该行之前插入一个打印类型(a.matched_images.count)命令吗?可能是一种方法?
  • 整数表达式一般为True,如果非零,则为False,否则。假设a.matched_images.count 是一个整数,如果值为负数,则两者的结果将不同。
  • 计数的数量是内置在环境中的(google app eninge + django),我相信当两个模型之间存在引用属性时,它是一个集合匹配数的 django 变量。是的,这可能是一种方法。感谢 cmets。
  • 感谢您的信息。我还在考虑语句 if isHumanif isHuman == True 之间的区别,如果变量只是设置为 None 或未启动,第一个评估的结果可能并不明显。因此,我认为最好使用更多默认值和语义默认值(应该避免使用可以具有三个值的布尔值)
  • @Nicklas R:“这可能是一种方法”?? “我不知道它是'0'还是0”??是什么阻止您发现它是什么?

标签: python if-statement


【解决方案1】:

count 的本质是什么?如果它是一个基本的 Python 编号,那么 if countif count != 0 相同。另一方面,如果count 是一个自定义类,那么它需要在Python 2.x 中实现__nonzero____len__,或者在Python 3.x 中实现__bool____len__。如果未定义这些方法,则该类的每个实例都被视为True

【讨论】:

  • django 模板变量,用于多个集合,引用变量在 GAE 手册中显示为 The value of the property is a Query for all entities that reference the entity,在模板上下文中,1.2 版中新增了对 和 == 的测试使用模板标签。所以性质是一个模板变量。
  • @Ethan: 如果 count 是 LESS THAN 零怎么办?
【解决方案2】:

不知道count 是什么,很难回答,但this excerpt 可能对你有用:。

以下值被认为是错误的:

  • 错误

  • 任何数字类型的零,例如,0、0L、0.0、0j。

  • 任何空序列,例如,''、()、[]。

  • 任何空映射,例如 {}。

  • 用户定义类的实例,如果该类定义了一个 __nonzero__()__len__() 方法,当该方法返回 整数零或布尔值 False。 [1]

所有其他值都被认为是真的——所以许多类型的对象都是 总是正确的。

【讨论】:

  • __nonzero__ 在 Python 2.x 中变为 __bool__ 在 Python 3.x 中
【解决方案3】:
>>> bool(0)
False

所以.. 不,如果它是一个 int 也没关系。请做一些追踪,打印出 count 的实际含义。

【讨论】:

  • 可能是这个问题>>> bool('0'),我会更仔细地看看发生了什么。我一直很确定该值为0,但我不知道它是'0'还是0
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多