두 줄을 'IS'와 비교 - 예상대로 수행하지 않음
-
06-07-2019 - |
문제
두 줄을 비교하려고합니다 ~이다. 한 문자열은 함수에 의해 반환되고 다른 문자열은 비교에서 방금 선언됩니다. ~이다 객체 아이덴티티에 대한 테스트 이 페이지, 또한 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