当我比较my_var == None时,我的编辑器警告我,但当我使用my_var为None时,没有警告。

我在Python shell中做了一个测试,并确定两者都是有效的语法,但我的编辑器似乎在说my_var是None是首选。

是这样吗?如果是的话,为什么?


当前回答

PEP 8定义在比较单例对象时最好使用is操作符。

其他回答

我最近遇到了这可能出错的地方。

import numpy as np
nparray = np.arange(4)

# Works
def foo_is(x=None):
    if x is not None:
        print(x[1])

foo_is()
foo_is(nparray)

# Code below raises 
# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
def foo_eq(x=None):
    if x != None:
        print(x[1])

foo_eq()
foo_eq(nparray)

我创建了一个函数,该函数可选地接受numpy数组作为参数,如果包含numpy数组则更改。如果我使用不等式运算符!=来测试是否包含它,这将引发ValueError(参见上面的代码)。如果我使用的不是none,代码正常工作。

PEP 8定义在比较单例对象时最好使用is操作符。

在将任意对象与None等单例对象进行比较时,通常首选is,因为它更快,更可预测。Is总是根据对象标识符进行比较,而==将做什么取决于操作数的确切类型,甚至取决于它们的顺序。

PEP 8支持这个建议,它明确指出“对像None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。”

另一个"=="不同于"is"的例子。当您从数据库中提取信息并检查值是否存在时,结果将是值或None。

请看下面的if和else。当数据库返回“None”时,只有“is”有效。如果用==代替,If语句将不起作用,它将直接转到else,即使结果是“None”。希望我讲清楚了。

conn = sqlite3.connect('test.db')
c = conn.cursor()
row = itemID_box.get()

# pull data to be logged so that the deletion is recorded
query = "SELECT itemID, item, description FROM items WHERE itemID LIKE '%" + row + "%'"
c.execute(query)
result = c.fetchone()

if result is None:
    # log the deletion in the app.log file
    logging = logger('Error')
    logging.info(f'The deletion of {row} failed.')
    messagebox.showwarning("Warning", "The record number is invalid")
else:
    # execute the deletion
    c.execute("DELETE from items WHERE itemID = " + row)
    itemID_box.delete(0, tk.END)
    messagebox.showinfo("Warning", "The record has been deleted")
    conn.commit()
    conn.close()

简介:

使用是当你想检查对象的标识(例如检查var是否为None)。当你想检查是否相等时使用==(例如var是否等于3?)

解释:

你可以自定义my_var == None返回True的类

e.g:

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

检查对象标识。只有一个对象None,所以当你执行my_var is None时,你是在检查它们是否实际上是相同的对象(而不仅仅是等效的对象)

换句话说,==是等价性检查(从对象到对象定义),而是对象同一性检查:

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects