今天写代码遇到下面的情况,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:标准值False
None:标准值None
0:所有类型的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没有值。
 


来自为知笔记(Wiz)


posted on 2013-03-31 10:32  T_shell  阅读(279)  评论(0编辑  收藏  举报