我正在尝试将两个字符串与 进行比较。一个字符串由函数返回,另一个字符串在比较中声明。 测试对象标识,但根据此页,由于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

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

有帮助吗?

解决方案

您引用的网站说:

  

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

但是

uSplit('theuser!host')

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

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


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

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top