将两个字符串与“is”进行比较时未按预期执行

2024-09-30 16:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用is比较两个字符串。一个字符串由函数返回,另一个字符串则在比较中声明。测试对象标识的,但是根据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'

输出:

^{pr2}$

我猜这是因为函数返回的字符串与字符串文本的“类型”不同。有没有办法让一个函数返回字符串文字?我知道我可以用==,但我只是好奇。在


Tags: 对象函数字符串host声明returnifis
3条回答

你引用的那一页写着“如果两个字符串相等,它们就被放在同一个内存位置”(emphasis mine)。Python提供文本字符串,但是从某个任意函数返回的字符串是单独的对象。is运算符可以看作是指针比较,因此两个不同的对象不会进行相同的比较(即使它们包含相同的字符,也就是说它们是相等的)。在

您遇到的事实是Python并不总是对它的所有字符串进行内接。更多详情请参阅:

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

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

If two string literals are equal, they have been put to same memory location.

但是

uSplit('theuser!host')

不是字符串文本,而是对文本'theuser!host'进行操作的结果。在

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


另外,您应该使用is来表示is None。使用它检查您设计的类的两个对象是否是同一个实例。你不能很容易地将它用于字符串或数字,因为创建这些内置类的规则很复杂。有些弦被截住了。同样,一些数字也被拘留了。在

相关问题 更多 >