【问题标题】:Conditional statement on None in Python [duplicate]Python中关于None的条件语句[重复]
【发布时间】:2020-05-15 02:05:43
【问题描述】:

PFB 程序。我们有一个条件块if curr > max_v or max_v == None:。这是一个错误

TypeError: '>' not supported between instances of 'int' and 'NoneType'

但是,如果我将条件更改为max_v == None or curr > max_v:,它就可以正常工作。这里有什么问题。请指教。

arr_ele = []

for arr_i in range(6):
    arr_t = [int(arr_temp) for arr_temp in input().strip().split()]
    arr_ele.append(arr_t)

length = len(arr_ele[0])


max_v = None
curr = 0
for i in range(length-2):
    for j in range(length-2):
        curr = arr_ele[i][j] + arr_ele[i][j+1] + arr_ele[i][j+2] + \
               arr_ele[i+1][j+1] + \
               arr_ele[i+2][j] + arr_ele[i+2][j+1] + arr_ele[i+2][j+2]


        if  curr > max_v or max_v == None:
            max_v = curr

print(max_v)

【问题讨论】:

  • 以相反的顺序写入以利用短路:if max_v is None or curr > max_v:
  • 问题只是您无法将整数与None 进行比较。除非您知道列表的最小值是多少,否则None 是初始化max_v 的绝佳方式;您只需使用max_v is None 正确检查它。
  • 这能回答你的问题吗? Does Python evaluate if's conditions lazily?
  • 关于or的行为:"表达式x or y首先计算x;如果x为真,则返回其值;否则,计算y并返回结果值。” 请注意,仅当第一部分为假时才评估第二部分。 docs.python.org/3/reference/expressions.html#boolean-operations
  • @kaya3 另外值得注意的是,and 运算符的作用正好相反。一旦返回一个条件False,表达式的其余部分就不会被计算。

标签: python if-statement


【解决方案1】:

Python 的解释器正在检查 max_v 是否为None,如果为True,则语句为真,并在运行max_v = curr 时执行该块。如果您在语句之间切换位置,则会检查 curr > max_v

如果当解释器到达if 条件时变量max_vNoneType,那么它会抛出错误,因为您无法检查整数是否大于None。

curr > max_v 放在首位,即首先评估的语句,如果您将max_v == None 作为第一个语句,则首先评估的语句。

尝试更改for 循环,为max_v 赋值或在for 循环之前为其赋值。

【讨论】:

    【解决方案2】:

    当 Python 处理这样的逻辑表达式时,它会从左到右计算表达式。
    curr > max_v or max_v == None中,当解释器处理curr > max_v时,如果变量max_v自定义以来没有改变它的值(None),它会尝试比较一个int和一个NoneType,这个操作是未定义/不允许。
    在语句max_v == None or curr > max_v 中,如果max_v 不是整数,解释器将永远不会计算curr > max_v
    一个解决方案是使用类似的东西:

    import math
    max_v = math.nan # Not a number
    ...
    curr > max_v or max_v == math.nan:
    ...
    

    顺便说一句,max_v == Noneis considered an anti-pattern.

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      相关资源
      最近更新 更多