今天写代码遇到下面的情况,ext_name是文件的扩展名,我想判断它是不是'.v'或者'.V',就写成了下面的:
if ext_name is not ('.v' or '.V'):然后出错了,经过翻书才知道对于or这种短路操作符,只要第一个表达式不是false,整个a or b返回的值就是a的值,否则就是b的值。对于and也是一样,只要a不是false,a and b返回的就是b的值。下列情况在python眼中都是false(假的):False:标准值FalseNone:标准值None0:所有类型的0(包括浮点数,长整型和其它类型)"":空字符串():空元组[]:空列表{}:空字典(注意:包含一个None元素的列表不是空的!)其余一切都是真的。所以if ext_name is not ('.v' or '.V'):等同于:
if ext_name is not '.v':
按说这样应该没错啊,明明ext_name 的值就是'.v',为什么ext_name is not '.v'的值还是true呢,原来is和is not都是对对象身份的比较,ext_name是由下面的语句得到的:
ext_name=os.path.splitext(file_name)[1]它的类型是<type 'unicode'>是一个unicode对象,而'.v'的类型是<type 'str'>,是一个字符串对象,所以它们不是同一个对象(注意:在python3中,所有字符串都是unicode)。如果两者都是字符串对象,只要两者的值相同,就是同一个对象了。
>>> a='a'
>>> a is 'a'
True另外还注意到一个细节,在C++中,这种写法是正确的:a=(b=3);因为b=3虽然是一个赋值语句,但是有值的,它的值就是3,而在python中,这种写法是错误的,b=3没有值。