'==' 또는 'is'를 사용하여 문자열을 비교하면 때때로 다른 결과가 나오는 이유는 무엇인가요?

두 개의 변수가 공용 값으로 설정된 파이썬 프로그램이 있습니다. 조건 표현식에서 var1 is var2 비교가 실패하지만 var1 == var2로 변경하면 True가 반환됩니다.

이제 파이썬 인터프리터를 열고 동일한 'is' 비교를 수행하면 성공합니다.

>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True

제가 뭘 놓치고 있는 걸까요?

질문에 대한 의견 (7)
해결책

is는 동일성 테스트,==`는 동일성 테스트입니다. 코드에서 일어나는 일은 인터프리터에서 이렇게 에뮬레이트됩니다:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

따라서 동일하지 않은 것은 당연하지 않나요?

다시 말해 isid(a) == id(b)입니다.

해설 (12)

여기에 대답을 수정하십시오 다른 있다. 아이디 '는' 사용되는 평등을 위해 사용되는 반면, 비교 '=' 비교. 이후 대한 어떤 신경습니까 는 평등 (포함해야 합니다 두 문장열 같은 자), 이 경우는 '는' 는 단순히 '=' 잘못된 진실이며당신이 연산자입니다 사용해야 한다.

그 이유는 '는' 작동됨 대화식으로 에로남이네 (가장) 문자열이어야 리터럴 있다 [돌아와] (https://en.wikipedia.org/wiki/String_interning) 을 기본적으로. 에서 위키백과:

&gt. 빨리 돌아와 문장열 구체화하십시오 &gt. 경우도 있으며, 비교 &gt. 응용 프로그램에서 성능 병목지역 &gt. (같은 컴파일러에도 및 동적 &gt. 프로그래밍 언어 런타임을) 가 &gt. 크게 의존하고 있는 해시 테이블 &gt. 문자열 키. 인턴 않고, &gt. 두 개의 서로 다른 문장열 확인하기 &gt. 모든 비유하 部门从 검토하고 있다. &gt. 캐릭터는 모두 써줬지 이는 &gt. 느린 여러 가지 이유로. 이는 &gt. o (n) 의 길이는 본질적으로 &gt. 문장열. 일반적으로 판독합니다 필요합니다. &gt. 여러 지역에 있는 메모리 &gt. 시간이 걸립니다. 그리고 이 판독합니다 가득 찰 &gt. 즉, 줄고 캐시하지 프로세서입니다 &gt. 필요에 따라 다른 캐시에는 사용할 수 있습니다. 함께 &gt. 간단한 객체에는 돌아와 문장열 &gt. 이후 충분하니라 id 테스트 &gt. 초기 운영, 인턴 이는 &gt. 일반적으로 구축됩니까 포인터로 &gt. 보통, 평등, 단 하나의 테스트 &gt. 명령 없이 시스템 메모리 &gt. 전혀 참조.

그래서 경우 두 문자열 리터럴 (나치도요 프로그램 소스 코드를 따옴표를 당신의 말 그대로 둘러싸여 있는 입력되었는지), 파이썬 프로그램에서 같은 값을 가지는 문자열 userdic. 컴파일러에서 자동으로 인턴 둘 다 동일한 메모리 위치에 저장된 위치. (참고로 이 doesn& # 39, t 항상 되는 규칙과 경우 이 문제가 상당하다는 뒤얽힌 그러니 제발 don& # 39 에서 비헤이비어를 의존하고, t 이 운영 코드를!)

이 때문에, 그들은 모두 동일한 메모리 위치를 실제로 저장됩니까 문장열 대화형 세션 id , 따라서 같은 '는' 작동자 정상적으로 작동합니다. 그러나 chunghwa 경우 다른 방법을 통해 문자열 (string map_layer 정확히요 경우에도 같은 자), 그 문자열을 string 비유하 같은 것은 있을 수 있지만, - 즉, 다른 경우 메모리에 저장된 id , 다른 장소에 있기 때문이다.

해설 (8)

is키워드는 객체의 동일성을 테스트하는 반면==`는 값 비교를 수행합니다.

is를 사용하면 객체가 동일한 객체일 경우에만 결과가 참이 됩니다. 그러나==`는 객체의 값이 같으면 언제든지 참이 됩니다.

해설 (0)

마지막으로 하나 유의해야 할 수 있도록 기능을 사용할 수 있습니다, 인턴, re getting 참조입니다 you& # 39 같은 문자열:

>>> a = intern('a')
>>> a2 = intern('a')
>>> a is a2
True

위에서 지적한 대로 할 수 있는 것은 없는듯 합니다 써줬지 확인할 수 있다. 그러나 이 경우 요구 사항을 알 수 있다 '는' 이상한 도움됐네 함정이거나 사용할 수 있습니다.

참고로, 인턴 기능 내장 함수를 기술입니까 잡을라는데 이동 중인 파이썬 모듈 '시스템' 을 3.

해설 (0)

아이디 '는' 는 '=' 는 평등, 테스트 테스트. 즉, '는' 는 두 가지 방식으로 동일한 , 셨으며 avamer 스피커에만 여부를 확인할 수 있다.

39 라고 you& '사람', ve got a simple object. # 39, & # 39 라는 경우 Jack&. # 39, & # 39 는 23&. s # 39 세 이전 잭에서 보유하고 있지만, 다른 23yr it& avamer 똑같은 사람이 없습니다.

class Person(object):
   def __init__(self, name, age):
       self.name = name
       self.age = age

   def __eq__(self, other):
       return self.name == other.name and self.age == other.age

jack1 = Person('Jack', 23)
jack2 = Person('Jack', 23)

jack1 == jack2 #True
jack1 is jack2 #False

하지만, re, re they& # 39 이 같은 나이의 they& # 39 인스턴스에서는 다를 것이다. # 39 의 문자열으로 it& 다를 수 있지만, avamer 다른 객체.

해설 (0)

그러나 이 성어는 때는기대어 참고, 파이썬,) 는 다음과 같은 것을 종종 볼 수 있습니다.

if x is None: 
    # some clauses

이 때문에 안전, [좁히어 가 보장받을 수 있는 한 인스턴스에서는 nulll 객체에는 (즉, 없음)] [1].

[1]: http://docs.python.org/library/stdtypes.html # 널 객체에는

해설 (3)

Re, re 잘 모르는 경우 you& # 39, & # 39, & # 39 you& 하고 list. # 39. = 이에 대해 & # 39, 조금 더 많이 알고 있으면 is& # 39 사용할 수 있습니다. # 39, & # 39 의 천체가 같은 None&;.

Ll end up 되고, 그렇지 않으면 you& # 39, 왜, 왜 이런 셨으며 doesn& # 39 빗나갔다.

>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False

39 m, 심지어 어떤 것들은 보장할 수 있을지는 확신할 i& 같은 간의 서로 다른 파이썬 버전을 임상의들의 / 구현.

해설 (4)

From my '는' 를 사용하여 두 개체 비교하십시오 볼 수 있는 제한된 경험하십시오 파이썬, 같은 경우 서로 다른 두 개의 같은 값이 객체에는 로케이터로 반대했다. 값이 동일한 '=' 여부를 결정하는 데 사용됩니다.

이 좋은 예다.

>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True

s1, s2 '가' 와 '정상' 은 유니코드 문자열을 구체화하십시오. 하지만 여러 유형이 같은 동일한 값을 못하고 있다.

해설 (1)

비교가 거짓으로 평가될 때 두 개의 서로 다른 객체가 사용된다는 사실과 관련이 있다고 생각합니다. 참으로 평가되면 내부적으로 동일한 객체를 사용하고 있으며 새 객체를 생성하지 않는다는 의미인데, 이는 아마도 2초 정도 내에 객체를 생성했고 최적화 사이에 큰 시간 간격이 없기 때문에 동일한 객체를 사용하기 때문일 수 있습니다.

그렇기 때문에 문자열 객체의 값을 비교할 때 is가 아닌 등호 연산자 ==를 사용해야 합니다.

>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>> 

이 예제에서는 이전에 &39;one' 과 같았던 다른 문자열 객체였던 s2를 s와 같은 객체로 만들었지만, 인터프리터가 처음에 &39;one' 에 할당하지 않았기 때문에 동일한 객체를 사용하지 않았기 때문에 동일한 객체가 아닙니다.

해설 (2)

있다고 믿지만, interned&quot &quot 이 알려져 있다. 써줬지 이 때문에, 자바, 파이썬 높여줍니까 높여줍니까 그렇게 C 와 C++ 에서 컴파일할 때 최적화되었는지 모드.

대신 사용할 경우, 두 개의 동일한 메모리 두 문자열 객체를 만들어 모든 걸 문장열 똑같은 콘텐츠를 가리키십시오 함께 돌아와 문장열 동일한 메모리.

그 결과, 파이썬 &quot is&quot. 2 와 동일한 내용이 가리킬 때 진정한 문장열 연산자입니다 때문에 같은 문자열 객체를. 또한 일어날 수 있는 자바와 c 이다.

이것은 단지 유용하게 사용할 수 있는 메모리 절감입니까 어쨌든요 이 때문에 delaymins 테스트하려면 문자열이어야 의존할 수 없는 경우가 JIT 컴파일러 및 번역기 및 다양한 엔진, 평등, do it.

해설 (0)

나는 질문을 하고 답을 없기 때문에 큰 문제는 비록 예전의 그들위에 언어 참조

사실 확인을 위한 id 는 연산자입니다 연산자입니다 평등을 위한 검사 및 =

  • 출처 언어 Reference:*

거의 모든 애스펙트를 객체에는 비헤이비어를 추상형데이터타입 영향을 줍니다. 심지어 중요도입니다 객체 id 는 영향을 받은 일부 한다. 실제로 새 값을 계산할 수 있는 변경 불가 유형, 운영체 와 동일한 유형 및 가치, 동시에 기존 객체에는 복귀하십시오 참조입니다 변경 가능 객체에는 한은수의 미허용 . E. g. 뒤에을 a = 1. b = 1, a 와 b 가 동일한 객체를 참조하지 수도 있고, 구축에 따라 값과 함께 한 이후에는 c = []; d = [], c, d 는 두 개의 서로 다른 독특한 새로 생성된 빈 열거합니다 보장할 수 있다. 참고로, c = d = [] 같은 객체에는 color_name 모두 c, d).

그래서 우리가 추론할 수 있는 문장열 기술서임을 위의 불변 유형, is&quot &quot 함께 원하는거요 체크된다면 실패할 수 있습니다. 성공할 수 있는 점검됩니다 체크된다면 &quot is";

Int, 튜플 번호로도 불변 유형은상위 마찬가지입니다

해설 (0)

이 '=' 작동자 테스트 값을 대등을. 이 '는' 운영자 아이디, 파이썬 테스트 테스트 객체에는 나열할지 2 정말 같은 개체 (즉, live at the 동일한 주소를 메모리에).

>>> a = 'banana'
>>> b = 'banana'
>>> a is b 
True

이 예에서는, 파이썬, 두 사람은 모두 1 만 'a' 와 'b' 는 문자열 객체를 생성할 수 있도록 한다. 그 이유는 일부 문장열 캐시합니다 표시됨과 최적화, 진짜 그냥 내부적으로 해당 파이썬 및 재사용합니다 banana& # 39, & # 39 좁히어 문자열으로. a 와 b 에 의해 공유됨 tufts. 더 이상 정상적인 비헤이비어를 문장열 트리거할 사용해야 합니다.

>>> a = 'a longer banana'
>>> b = 'a longer banana'
>>> a == b, a is b
(True, False)

두 확보하십시오 열거합니다 만들 때 두 개의 천체.

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

이 경우 두 같은 요소를 갖고 있기 때문에, 우리는 이렇게 말할 수 있다 (단, 해당 열거합니다 avamer 동일해집니다 아니기 때문에 동일한 객체를. 두 경우 모두 동일해집니다 객체에는 avamer, 또한 이들은, 이들은 필요는 없지만, 만약 avamer 동일해집니다.

만약 b = a ',' a '는' 진실이며당신이 충족되었으며 객체에는 할당할지 com/go/4e6b330a_kr 모두가 동일한 객체에는) 는 다음과 같은 뜻이 있다.

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
해설 (0)

비교하십시오 '는' 가 메모리 위치. 사용되는 것은 레벨 비교.

'=' 가 있는 변수를 비교하십시오 프로그램였어 이상의 가치와 레벨이네 확인을 위해 사용됩니다.

'는' 주소 확인을 위한 동등성의 수준

값을 확인하는 동등성의 수준 '='

해설 (0)

아이디 '는' 는 '=' 는 테스트 테스트, 평등 (http://otl. [파이썬 문서용으로] (https://docs.python.org/3/library/stdtypes.html # 비교)).

대부분의 경우, 만약 a 가 b ',' 다음 'a = b'. 수축됐는데 예외가 있기는 하지만, 예를 들면 다음과 같습니다.

>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False

그래서 '는' id 만 사용할 수 있습니다, 절대 평등의 테스트 테스트.

해설 (0)