有趣的是:
>>> a = 123
>>> b = 123
>>> a is b
True
>>> a = 123.
>>> b = 123.
>>> a is b
False
看起来a is b
被定义为id(a) == id(b)
。这种方式很容易出现错误:
basename, ext = os.path.splitext(fname)
if ext is '.mp3':
# do something
else:
# do something else
一些 fnames 意外地出现在 else 块中。修复很简单,我们应该使用 ext == '.mp3'
而不是 if ext is '.mp3'
,但表面上看来 if ext is '.mp3'
看起来像是一种不错的 Pythonic 写法,比“正确”的写法更可读。
由于字符串是不可变的,为什么它是错误的技术细节是什么?何时使用身份检查更好,何时使用相等性检查更好?