'==' 또는 'is'를 사용하여 문자열을 비교하면 때때로 다른 결과가 나오는 이유는 무엇인가요?
두 개의 변수가 공용
값으로 설정된 파이썬 프로그램이 있습니다. 조건 표현식에서 var1 is var2
비교가 실패하지만 var1 == var2
로 변경하면 True
가 반환됩니다.
이제 파이썬 인터프리터를 열고 동일한 'is' 비교를 수행하면 성공합니다.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
제가 뭘 놓치고 있는 걸까요?
1070
14
is
는 동일성 테스트,
==`는 동일성 테스트입니다. 코드에서 일어나는 일은 인터프리터에서 이렇게 에뮬레이트됩니다:따라서 동일하지 않은 것은 당연하지 않나요?
다시 말해
is
는id(a) == id(b)
입니다.여기에 대답을 수정하십시오 다른 있다. 아이디 '는' 사용되는 평등을 위해 사용되는 반면, 비교 '=' 비교. 이후 대한 어떤 신경습니까 는 평등 (포함해야 합니다 두 문장열 같은 자), 이 경우는 '는' 는 단순히 '=' 잘못된 진실이며당신이 연산자입니다 사용해야 한다.
그 이유는 '는' 작동됨 대화식으로 에로남이네 (가장) 문자열이어야 리터럴 있다 [돌아와] (https://en.wikipedia.org/wiki/String_interning) 을 기본적으로. 에서 위키백과:
>. 빨리 돌아와 문장열 구체화하십시오 >. 경우도 있으며, 비교 >. 응용 프로그램에서 성능 병목지역 >. (같은 컴파일러에도 및 동적 >. 프로그래밍 언어 런타임을) 가 >. 크게 의존하고 있는 해시 테이블 >. 문자열 키. 인턴 않고, >. 두 개의 서로 다른 문장열 확인하기 >. 모든 비유하 部门从 검토하고 있다. >. 캐릭터는 모두 써줬지 이는 >. 느린 여러 가지 이유로. 이는 >. o (n) 의 길이는 본질적으로 >. 문장열. 일반적으로 판독합니다 필요합니다. >. 여러 지역에 있는 메모리 >. 시간이 걸립니다. 그리고 이 판독합니다 가득 찰 >. 즉, 줄고 캐시하지 프로세서입니다 >. 필요에 따라 다른 캐시에는 사용할 수 있습니다. 함께 >. 간단한 객체에는 돌아와 문장열 >. 이후 충분하니라 id 테스트 >. 초기 운영, 인턴 이는 >. 일반적으로 구축됩니까 포인터로 >. 보통, 평등, 단 하나의 테스트 >. 명령 없이 시스템 메모리 >. 전혀 참조.
그래서 경우 두 문자열 리터럴 (나치도요 프로그램 소스 코드를 따옴표를 당신의 말 그대로 둘러싸여 있는 입력되었는지), 파이썬 프로그램에서 같은 값을 가지는 문자열 userdic. 컴파일러에서 자동으로 인턴 둘 다 동일한 메모리 위치에 저장된 위치. (참고로 이 doesn& # 39, t 항상 되는 규칙과 경우 이 문제가 상당하다는 뒤얽힌 그러니 제발 don& # 39 에서 비헤이비어를 의존하고, t 이 운영 코드를!)
이 때문에, 그들은 모두 동일한 메모리 위치를 실제로 저장됩니까 문장열 대화형 세션 id , 따라서 같은 '는' 작동자 정상적으로 작동합니다. 그러나 chunghwa 경우 다른 방법을 통해 문자열 (string map_layer 정확히요 경우에도 같은 자), 그 문자열을 string 비유하 같은 것은 있을 수 있지만, - 즉, 다른 경우 메모리에 저장된 id , 다른 장소에 있기 때문이다.
is
키워드는 객체의 동일성을 테스트하는 반면
==`는 값 비교를 수행합니다.is
를 사용하면 객체가 동일한 객체일 경우에만 결과가 참이 됩니다. 그러나
==`는 객체의 값이 같으면 언제든지 참이 됩니다.마지막으로 하나 유의해야 할 수 있도록 기능을 사용할 수 있습니다, 인턴, re getting 참조입니다 you& # 39 같은 문자열:
위에서 지적한 대로 할 수 있는 것은 없는듯 합니다 써줬지 확인할 수 있다. 그러나 이 경우 요구 사항을 알 수 있다 '는' 이상한 도움됐네 함정이거나 사용할 수 있습니다.
참고로, 인턴 기능 내장 함수를 기술입니까 잡을라는데 이동 중인 파이썬 모듈 '시스템' 을 3.
아이디 '는' 는 '=' 는 평등, 테스트 테스트. 즉, '는' 는 두 가지 방식으로 동일한 , 셨으며 avamer 스피커에만 여부를 확인할 수 있다.
39 라고 you& '사람', ve got a simple object. # 39, & # 39 라는 경우 Jack&. # 39, & # 39 는 23&. s # 39 세 이전 잭에서 보유하고 있지만, 다른 23yr it& avamer 똑같은 사람이 없습니다.
하지만, re, re they& # 39 이 같은 나이의 they& # 39 인스턴스에서는 다를 것이다. # 39 의 문자열으로 it& 다를 수 있지만, avamer 다른 객체.
그러나 이 성어는 때는기대어 참고, 파이썬,) 는 다음과 같은 것을 종종 볼 수 있습니다.
이 때문에 안전, [좁히어 가 보장받을 수 있는 한 인스턴스에서는 nulll 객체에는 (즉, 없음)] [1].
[1]: http://docs.python.org/library/stdtypes.html # 널 객체에는
Re, re 잘 모르는 경우 you& # 39, & # 39, & # 39 you& 하고 list. # 39. = 이에 대해 & # 39, 조금 더 많이 알고 있으면 is& # 39 사용할 수 있습니다. # 39, & # 39 의 천체가 같은 None&;.
Ll end up 되고, 그렇지 않으면 you& # 39, 왜, 왜 이런 셨으며 doesn& # 39 빗나갔다.
39 m, 심지어 어떤 것들은 보장할 수 있을지는 확신할 i& 같은 간의 서로 다른 파이썬 버전을 임상의들의 / 구현.
From my '는' 를 사용하여 두 개체 비교하십시오 볼 수 있는 제한된 경험하십시오 파이썬, 같은 경우 서로 다른 두 개의 같은 값이 객체에는 로케이터로 반대했다. 값이 동일한 '=' 여부를 결정하는 데 사용됩니다.
이 좋은 예다.
s1, s2 '가' 와 '정상' 은 유니코드 문자열을 구체화하십시오. 하지만 여러 유형이 같은 동일한 값을 못하고 있다.
비교가 거짓으로 평가될 때 두 개의 서로 다른 객체가 사용된다는 사실과 관련이 있다고 생각합니다. 참으로 평가되면 내부적으로 동일한 객체를 사용하고 있으며 새 객체를 생성하지 않는다는 의미인데, 이는 아마도 2초 정도 내에 객체를 생성했고 최적화 사이에 큰 시간 간격이 없기 때문에 동일한 객체를 사용하기 때문일 수 있습니다.
그렇기 때문에 문자열 객체의 값을 비교할 때
is
가 아닌 등호 연산자==
를 사용해야 합니다.이 예제에서는 이전에 &39;one' 과 같았던 다른 문자열 객체였던 s2를
s
와 같은 객체로 만들었지만, 인터프리터가 처음에 &39;one' 에 할당하지 않았기 때문에 동일한 객체를 사용하지 않았기 때문에 동일한 객체가 아닙니다.있다고 믿지만, interned" " 이 알려져 있다. 써줬지 이 때문에, 자바, 파이썬 높여줍니까 높여줍니까 그렇게 C 와 C++ 에서 컴파일할 때 최적화되었는지 모드.
대신 사용할 경우, 두 개의 동일한 메모리 두 문자열 객체를 만들어 모든 걸 문장열 똑같은 콘텐츠를 가리키십시오 함께 돌아와 문장열 동일한 메모리.
그 결과, 파이썬 " is". 2 와 동일한 내용이 가리킬 때 진정한 문장열 연산자입니다 때문에 같은 문자열 객체를. 또한 일어날 수 있는 자바와 c 이다.
이것은 단지 유용하게 사용할 수 있는 메모리 절감입니까 어쨌든요 이 때문에 delaymins 테스트하려면 문자열이어야 의존할 수 없는 경우가 JIT 컴파일러 및 번역기 및 다양한 엔진, 평등, do it.
나는 질문을 하고 답을 없기 때문에 큰 문제는 비록 예전의 그들위에 언어 참조
사실 확인을 위한 id 는 연산자입니다 연산자입니다 평등을 위한 검사 및 =
거의 모든 애스펙트를 객체에는 비헤이비어를 추상형데이터타입 영향을 줍니다. 심지어 중요도입니다 객체 id 는 영향을 받은 일부 한다. 실제로 새 값을 계산할 수 있는 변경 불가 유형, 운영체 와 동일한 유형 및 가치, 동시에 기존 객체에는 복귀하십시오 참조입니다 변경 가능 객체에는 한은수의 미허용 . E. g. 뒤에을 a = 1. b = 1, a 와 b 가 동일한 객체를 참조하지 수도 있고, 구축에 따라 값과 함께 한 이후에는 c = []; d = [], c, d 는 두 개의 서로 다른 독특한 새로 생성된 빈 열거합니다 보장할 수 있다. 참고로, c = d = [] 같은 객체에는 color_name 모두 c, d).
그래서 우리가 추론할 수 있는 문장열 기술서임을 위의 불변 유형, is" " 함께 원하는거요 체크된다면 실패할 수 있습니다. 성공할 수 있는 점검됩니다 체크된다면 " is";
Int, 튜플 번호로도 불변 유형은상위 마찬가지입니다
이 '=' 작동자 테스트 값을 대등을. 이 '는' 운영자 아이디, 파이썬 테스트 테스트 객체에는 나열할지 2 정말 같은 개체 (즉, live at the 동일한 주소를 메모리에).
이 예에서는, 파이썬, 두 사람은 모두 1 만 'a' 와 'b' 는 문자열 객체를 생성할 수 있도록 한다. 그 이유는 일부 문장열 캐시합니다 표시됨과 최적화, 진짜 그냥 내부적으로 해당 파이썬 및 재사용합니다 banana& # 39, & # 39 좁히어 문자열으로. a 와 b 에 의해 공유됨 tufts. 더 이상 정상적인 비헤이비어를 문장열 트리거할 사용해야 합니다.
두 확보하십시오 열거합니다 만들 때 두 개의 천체.
이 경우 두 같은 요소를 갖고 있기 때문에, 우리는 이렇게 말할 수 있다 (단, 해당 열거합니다 avamer 동일해집니다 아니기 때문에 동일한 객체를. 두 경우 모두 동일해집니다 객체에는 avamer, 또한 이들은, 이들은 필요는 없지만, 만약 avamer 동일해집니다.
만약 b = a ',' a '는' 진실이며당신이 충족되었으며 객체에는 할당할지 com/go/4e6b330a_kr 모두가 동일한 객체에는) 는 다음과 같은 뜻이 있다.
비교하십시오 '는' 가 메모리 위치. 사용되는 것은 레벨 비교.
'=' 가 있는 변수를 비교하십시오 프로그램였어 이상의 가치와 레벨이네 확인을 위해 사용됩니다.
'는' 주소 확인을 위한 동등성의 수준
값을 확인하는 동등성의 수준 '='
아이디 '는' 는 '=' 는 테스트 테스트, 평등 (http://otl. [파이썬 문서용으로] (https://docs.python.org/3/library/stdtypes.html # 비교)).
대부분의 경우, 만약 a 가 b ',' 다음 'a = b'. 수축됐는데 예외가 있기는 하지만, 예를 들면 다음과 같습니다.
그래서 '는' id 만 사용할 수 있습니다, 절대 평등의 테스트 테스트.