【问题标题】:Truthiness test not performing as expected真实性测试未按预期执行
【发布时间】:2017-04-02 15:26:11
【问题描述】:

我有一个简单的函数,可以测试元组中的一个项目,看看它是否真实。出于某种原因,所有测试都返回 True (...if connection:...),即使正在测试的值是 1(假定为 True)或 0(假定为 false)。

我测试了1 == True(输出:True),1 == False(False),连接是否为True(False)只是为了尝试了解发生了什么。

用户输入:players = [('a', 1), ('b', 0)]

功能:

def validplayers(players):
    for player, connection in players:
        if connection:
            player
        print player, connection, 1 == True, 1 == False, connection is True

输出:

a 1 True False False
b 0 True False False

connection var 传递了 type(connection) 定义为 int 的 1 或 0。

【问题讨论】:

  • 你没有在if 声明中任何事情。你只引用player,没有别的。这种表达方式一无所获。
  • 我是一名学习python的学生。该功能不应该只显示具有 1(真)连接的玩家吗?
  • 为什么要这样? print 语句不是 if 测试的一部分。它总是被执行。
  • 如果您希望这种情况发生,print 的缩进位置错误。
  • 是否不接受学习该语言的学生提出的问题?不知道为什么或不赞成一个问题意味着什么。这是一个愚蠢的问题还是这是否意味着堆栈溢出太容易了?

标签: python truthiness


【解决方案1】:

您的错误在于connection is True。这总是Falseistests for identity,两个表达式导致对内存中相同对象的引用

如果要打印对象的真值,请使用bool() function

>>> bool(1)
True
>>> bool(0)
False

1 == True 之所以有效是因为在 Python 中,bool 类型是 int 的子类:

>>> issubclass(bool, int)
True

True的整数值为1,False的整数值为0。测试相等性不适用于其他整数值:

>>> 1 == True
True
>>> 2 == True
False
>>> bool(2)
True

请注意,您的 if 测试在其他方面毫无意义;唯一执行与否的是行 player,这是一个无操作表达式,仅返回对 player 的引用,但由于没有其他内容,因此该引用未被使用。

如果您希望仅在if 为真时执行print 语句,则需要将其缩进到if 的右侧并使其成为嵌套块的一部分:

def validplayers(players):
    for player, connection in players:
        if connection:
            print player, connection, bool(connection)

这只会为玩家a打印一些东西:

>>> def validplayers(players):
...     for player, connection in players:
...         if connection:
...             print player, connection, bool(connection)
...
>>> validplayers([('a', 1), ('b', 0)])
a 1 True

【讨论】:

  • 感谢您的解释!这解决了问题。我想最终在我的模块中使用这个函数将有效的玩家传递给另一个函数来形成“团队”。我可能会提出更多愚蠢的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2017-12-15
  • 2011-02-25
  • 2012-11-23
  • 2014-10-20
相关资源
最近更新 更多