ホームページ  >  に質問  >  本文

python 中 "if x is not None" 和 "if not x is None" 有什么区别?

google 的 python 风格指南中这么说:

Beware of writing if x: when you really mean if x is not None:—e.g., when testing whether a variable or argument that defaults to None was set to some other value. The other value might be a value that's false in a boolean context!

也就是说,推荐使用 if x is not None 进行判断,but why?

伊谢尔伦伊谢尔伦2743日前1001

全員に返信(6)返信します

  • PHP中文网

    PHP中文网2017-04-17 13:38:45

    内容和标题不符,if xif not x is None 是不一样的。

    if x 会对x做 __nonzero__ 判断,当 x 为 ''(空字符串),{}(空字典), 0 的时候都是 False。当你确实要判断一个变量不是 None 的时候,应该用 if x is not None

    至于 if not x is Noneif x is not None 是一样的,选一个你读的顺的就好。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 13:38:45

    前者更接近白话文,而后者有可能使读者误解为if (not x) is None.

    返事
    0
  • 黄舟

    黄舟2017-04-17 13:38:45

    首先,直接查看操作码(XP+Python3.4)。
    x is not None的操作码:

    dis.dis('if x is not None: pass')
         0 LOAD_NAME               0 (x)
         3 LOAD_CONST              0 (None)
         6 COMPARE_OP              9 (is not)
         9 POP_JUMP_IF_FALSE       15
        12 JUMP_FORWARD            0 (to 15)
    >>  15 LOAD_CONST              0 (None)
        18 RETURN_VALUE
    

    if not x is None的操作码:

    dis.dis('if not x is None: pass')
         0 LOAD_NAME                0 (x)
         3 LOAD_CONST               0 (None)
         6 COMPARE_OP               9 (is not)
         9 POP_JUMP_IF_FALSE       15
        12 JUMP_FORWARD             0 (to 15)
    >>  15 LOAD_CONST               0 (None)
        18 RETURN_VALUE
    

    可以看到,操作码是一样的!
    题主还可以测试后面加or或者and的情况。

    个人意见,if x is not Noneif not x is None更加易读,毕竟英语当中有一个 isn't 呢。

    返事
    0
  • PHPz

    PHPz2017-04-17 13:38:45

    if not x is Noneif x is not None 對計算機而言是一樣的。對人類而言是不一樣的。

    前者的隱含意義是x本該是None結果不是,後者是x不該是None結果也不是。個人感覺,無客觀依據(好像沒有人做這樣的心理實驗?)。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 13:38:45

    前者更pythonic

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 13:38:45

    假如原本你的xNone
    你要执行如下代码判断x是否已经发生改变,仍为None

    x = False
    if x:
        print 'yes'
    else:
        print 'no'
    

    你得到会是 no ,其实 x 已经被改变了,但仍然是False

    if not x is Noneif x is not None 结果是一样的。

    if not x is None => if not (x is None)
    if x is not None => if x (is not) None

    返事
    0
  • キャンセル返事