python字符串is、==比较区别,以及用于多进程时的坑
程序员文章站
2024-03-22 21:13:28
...
前言
之前没有区分过is和==,今天多进程遇到一个bug,单进程没问题,经过一番盘查发现竟然是判断字符串方式出了问题,触及了知识盲区,记录一下。
is,==,cmp的区别
is
python中的 is 用来判断是否是同一个对象,也就是说is是来判断两个变量的地址引用是否相同,相同的话返回true,表示这两个变量的内存ID是相同的(查内存地址用 id() ),不相同的话返回false。单进程的时候几乎没影响,is也能判断字符串的一致
def cmp_string(s1):
print(s1 is'abc')
if __name__ == '__main__':
x = 'abc'
cmp_string(x)
结果为:
True
Process finished with exit code 0
==
python中的‘==’ 是用来判断两个对象的值是否相等的,比如判断两个数字的值是否相等。判断的是内存块里存的值。
def cmp_string(s1):
print(s1 == 'abc')
if __name__ == '__main__':
x = 'abc'
cmp_string(x)
结果为:
True
Process finished with exit code 0
cmp
cmp() 函数则是相当于判断符,比如‘<’, ‘==’,‘>’ 符号,注意python3版本中这个函数被去掉了!
多进程中的小bug
多进程中如果用is就会出错
from multiprocessing import Pool
def cmp_string(s1):
print(s1 is 'abc')
if __name__ == '__main__':
p = Pool(12)
x = 'abc'
for i in range(2):
res = p.apply_async(cmp_string, args=(x,))
res.get()
print('子进程开始...')
p.close()
p.join()
print('所有子进程结束!')
结果为:
False
False
子进程开始...
所有子进程结束!
Process finished with exit code 0
注意,这里有多进程输入参数和获取错误信息的小技巧,可以参考这篇文章。
因此还是尽量使用运算符==。
上一篇: python文件过滤,去重,排序
下一篇: 数据库范式