2

我正在尝试将两个字符串与is进行比较。一个字符串由函数返回,而另一个只是在比较中声明。测试对象身份,但根据这个页面,由于 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'

输出:

输入“str”
用户
失败的
行

我猜这是因为函数返回的字符串是与字符串文字不同的字符串“类型”。无论如何要获得一个返回字符串文字的函数吗?我知道我可以使用==,但我只是好奇。

4

3 回答 3

4

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

于 2009-08-01T09:50:39.273 回答
3

你引用的网站是这样说的:

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

uSplit('theuser!host')

不是字符串文字——它是对文字进行操作的结果'theuser!host'

无论如何,您通常不应该使用 来检查字符串是否相等is,因为无论如何这种内存优化只是您不应该依赖的实现细节。


此外,您应该is使用is None. 用它来检查两个对象——你设计的类——是否是同一个实例。您不能轻易地将它用于字符串或数字,因为创建这些内置类的规则很复杂。一些字符串被保留。同样,一些数字也被拘留。

于 2009-08-01T09:51:16.540 回答
0

您遇到的事实是 Python 并不总是对所有字符串进行内部处理。更多细节在这里:

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

于 2009-08-01T09:52:14.917 回答