将两个字符串与'is'进行比较 - 未按预期执行

时间:2009-08-01 09:44:38

标签: python string-comparison string-literals

我正在尝试将两个字符串与 进行比较。一个字符串由函数返回,另一个字符串在比较中声明。 测试对象标识,但根据this page,由于Python的内存优化,它也可以使用两个相同的字符串。但是,以下方法不起作用:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

输出:

type 'str'
theuser
failed
ok

我猜这是因为函数返回的字符串是字符串的不同“类型”而不是字符串文字。反正有没有函数返回字符串文字?我知道我可以使用 == ,但我只是好奇。

3 个答案:

答案 0 :(得分:3)

你引用的那个页面说“如果两个字符串文字相等,它们就被放到了相同的内存位置”(强调我的)。 Python实习文字字符串,但从某些任意函数返回的字符串是单独的对象。可以将is运算符视为指针比较,因此两个不同的对象不会相同(即使它们包含相同的字符,即它们相等)。

答案 1 :(得分:2)

您引用的网站说:

  

如果两个字符串文字相等,则它们被放在相同的内存位置。

但是

uSplit('theuser!host')

不是字符串文字 - 它是文字'theuser!host'上的操作的结果。

无论如何,你通常不应该使用is检查字符串是否相等,因为在任何情况下,这种内存优化只是一个你不应该依赖的实现细节。


此外,您应该使用is来处理is None之类的内容。用它来检查两个对象 - 你设计的类 - 是否是同一个实例。您不能轻易地将它用于字符串或数字,因为创建这些内置类的规则很复杂。一些字符串被实习。类似地,有些数字是实习的。

答案 2 :(得分:0)

您遇到的事实是Python并不总是实习其所有字符串。更多细节:

http://mail.python.org/pipermail/tutor/2009-July/070157.html