【问题标题】:Python if statement: False vs. 0.0Python if 语句:False vs. 0.0
【发布时间】:2010-10-16 12:25:30
【问题描述】:

是否可以:

for k,v in kwargs.items()
    if v == None or v == '' or v == 1.0 or v == False:
       del kwargs[k]

如果 v == 0.0 不删除密钥? (False 似乎等于 0.0),并且不删除等于 True 的键。

【问题讨论】:

  • 仅供参考,这在 Python 2.x 中有效,但在 Python 3 中,.items() 返回一个惰性迭代对象而不是项元组列表。在遍历字典时删除项目将导致RuntimeError then。

标签: python if-statement


【解决方案1】:

或者你可以这样说:

if v in (None, '', 1.0) or v is False:

【讨论】:

  • 不。 0.0 in (None,'',1.0,False) -> 正确,因为序列的线性搜索 in 使用 ==(这通常是想要的行为,但不是这里)。
  • @delnan: 是的,我只是改变它,问题在于 False ,因为 0.0 == False ,所以他应该只输入“is False”
  • v=True 失败,因为 1.0 == True。
  • @Mark Tolonen:是的,你是对的,但我认为 Izz 已经纠正了它:)
【解决方案2】:

您应该使用v is False 而不是v == False。这同样适用于您与None 的比较。见PEP 8 - Style Guide for Python

应始终使用“is”或“is not”与单例(如 None)进行比较,而不应使用相等运算符。

【讨论】:

  • 你绝对应该(适用于所有单身人士,例如TrueNone)。
  • @delnan:是的,你是对的。我更改了措辞并添加了更多细节。
  • ...如果这样做,您可以删除or v =='' 部分。
  • 但这不适用于真/假。参见python.org/dev/peps/pep-0008 中的最后一点:Goodif greetingif greeting == True最差if greeting is True
  • @James Blackburn:这是关于测试布尔值的,但这在这里行不通。阅读问题:他不想测试值是否真实,他也特别想测试类型。请注意样式指南的顶部:“但最重要的是:知道什么时候不一致——有时样式指南并不适用。”当然,您可以争辩说 OP 一开始就不应该尝试这样做。
【解决方案3】:

根据 PEP 8 中的建议让大家慢下来:

不要使用 == 将布尔值与 True 或 False 进行比较

   Yes:   if greeting:

   No:    if greeting == True:

   Worse: if greeting is True:

另外比较浮点值你不应该使用==但是

abs(x-other)

【讨论】:

  • if not x 肯定胜过if x == False。但在这里,问题是如何检查某个东西是否真的是布尔值False,而不是“虚假”。
【解决方案4】:

你也可以使用

if not v:
    # do something

这可能不如if v is False 精确,因为如果v0Noneempty set 等,它也会运行。

我遇到了这个问题,上面的解决方案对我有用。

【讨论】:

  • 你能用更多代码包含一个更解释的答案吗?
【解决方案5】:

感谢您的回复。使用建议,问题解决了:

kwargs = {'None': None, 'empty': '', 'False': False, 'float': 1.0, 'True': True}       
for k,v in kwargs.items():
    if v in (None, '', 1.0) and v is not True:
        del kwargs[k]
    if v is False:
        del kwargs[k]

kwargs
{'True': True}

-->

kwargs = {'None': None, 'empty': '', 'False': False, 'float': 0.0, 'True': True}       
for k,v in kwargs.items():
     if v in (None, '', 1.0) and v is not True:
         del kwargs[k]
     if v is False:
         del kwargs[k]

kwargs
{'True': True, 'float': 0.0}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2013-07-09
    • 2013-08-22
    相关资源
    最近更新 更多