我正在尝试将两个字符串与 进行比较。一个字符串由函数返回,另一个字符串在比较中声明。 测试对象标识,但根据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
我猜这是因为函数返回的字符串是字符串的不同“类型”而不是字符串文字。反正有没有函数返回字符串文字?我知道我可以使用 == ,但我只是好奇。
答案 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