문제

두 줄을 비교하려고합니다 ~이다. 한 문자열은 함수에 의해 반환되고 다른 문자열은 비교에서 방금 선언됩니다. ~이다 객체 아이덴티티에 대한 테스트 이 페이지, 또한 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 같은 것들을 위해 is None. 설계 한 클래스의 두 개체가 동일한 인스턴스인지 확인하려면 확인하십시오. 내장 클래스의 생성 규칙이 복잡하기 때문에 문자열이나 숫자에 쉽게 사용할 수 없습니다. 일부 문자열은 인턴됩니다. 마찬가지로 일부 숫자는 인턴됩니다.

다른 팁

당신이 인용 한 그 페이지는 "두 개의 문자열이 있다면 리터럴 동일하게, 그들은 동일한 메모리 위치에 놓여졌습니다. "(강조 광산). 파이썬 인턴 리터럴 스트링이지만, 임의의 기능에서 반환되는 문자열은 별도의 개체입니다. is 연산자는 포인터 비교로 생각할 수 있으므로 두 개의 다른 객체가 동일하게 비교되지 않습니다 (동일한 문자를 포함하더라도 동일합니다).

당신이 달린 것은 파이썬이 항상 모든 줄을 인턴시키는 것은 아니라는 사실입니다. 자세한 내용 :

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top