【问题标题】:Why is a list containing objects False when value tested?为什么在测试值时包含对象的列表为 False?
【发布时间】:2012-11-28 04:11:49
【问题描述】:

我希望一个空列表将 test 值设为 False,但我有点困惑,为什么包含对象的列表的引用在测试值时也报告为 False,如下例所示:

>>> weapon = []
>>> weapon == True
False
>>> weapon.append("sword")
>>> weapon == True
False
>>> weapon
['sword']

如果weapon = [] 为假,为什么weapon = ['sword'] 也会为假?根据文档http://docs.python.org/release/2.4.4/lib/truth.html,它应该是 True。我对此的理解缺少什么?

【问题讨论】:

  • 因为你使用的是== True
  • 但是如果weapon = ['sword'] 那么武器不应该是True 所以weapon == True? Weapon 等于一个对象,而不是 None 或一个空字符串。该文档指出“任何空序列,例如''、()、[]”。被认为是错误的......因此,一个非空字符串应该 == True。

标签: python object truthtable


【解决方案1】:

你应该检查一下

In [1]: w = []

In [2]: if w:
   ...:     print True
   ...: else:
   ...:     print False
   ...:
False

【讨论】:

    【解决方案2】:

    当你这样做时:

    w = []
    if w:
        print "Truthy"
    else:
        print "Falsy"
    

    要注意的关键是,无论您在if 子句中测试什么,都将被强制转换为布尔值。明确地说:

    w = []
    if bool(w):
        print "Truthy"
    else:
        print "Falsy"
    

    如果要将苹果与苹果进行比较,那么您不想将 ["sword"]True 进行比较。相反,您想将 bool(["sword"])True 进行比较:

    bool(["sword"]) == True
    # True
    

    【讨论】:

      【解决方案3】:

      如果要直接比较,需要使用bool()

      >>> weapon = []
      >>> bool(weapon) == True
      False
      >>> weapon.append("sword")
      >>> bool(weapon) == True
      True
      

      当您使用ifwhile 测试条件时,会隐式完成到bool 的转换

      >>> if weapon == True:  # weapon isn't equal to True
      ...     print "True"
      ... 
      >>> if weapon:
      ...     print "True"
      ... 
      True
      

      【讨论】:

      • 谢谢,这有帮助。当我使用布尔值通过定义的函数评估 weapon 时,只要它包含对象,它就会评估为 True,如果为空,则评估为 False。
      • @VinBreau,没错。相同类型的东西适用于空字符串、空元组、空字典、空集等。
      【解决方案4】:

      从那篇文章中,请注意,即使事物被认为具有“真实”真值,它们也不一定是 == True。例如:

      ["hi"] == True 
      // False
      
      if ["hi"]:
          print("hello")
      // prints hello
      

      【讨论】:

        【解决方案5】:

        文档说“可以测试任何对象的真值”而不是[] == False['whatever'] == True。您应该测试文档中指定的对象“用于 if 或 while 条件或作为布尔运算的操作数”

        【讨论】:

          猜你喜欢
          • 2013-05-12
          • 2015-09-01
          • 2020-10-12
          • 1970-01-01
          • 1970-01-01
          • 2017-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多