当我比较my_var == None时,我的编辑器警告我,但当我使用my_var为None时,没有警告。
我在Python shell中做了一个测试,并确定两者都是有效的语法,但我的编辑器似乎在说my_var是None是首选。
是这样吗?如果是的话,为什么?
当我比较my_var == None时,我的编辑器警告我,但当我使用my_var为None时,没有警告。
我在Python shell中做了一个测试,并确定两者都是有效的语法,但我的编辑器似乎在说my_var是None是首选。
是这样吗?如果是的话,为什么?
当前回答
另一个"=="不同于"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()
其他回答
另一个"=="不同于"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()
PEP 8定义在比较单例对象时最好使用is操作符。
在将任意对象与None等单例对象进行比较时,通常首选is,因为它更快,更可预测。Is总是根据对象标识符进行比较,而==将做什么取决于操作数的确切类型,甚至取决于它们的顺序。
PEP 8支持这个建议,它明确指出“对像None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。”
简介:
使用是当你想检查对象的标识(例如检查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
我最近遇到了这可能出错的地方。
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,代码正常工作。