'==' 또는 'is'를 사용하여 문자열을 비교하면 결과가 달라질 수 있는 이유는 무엇입니까?
두 문자열 변수가 동일한 값으로 설정됩니다. s1 == s2
반환하다True
s1 is s2
돌아오다False
.
Python을 is
성공: 성공, 성공:
>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True
왜 이러한가?
is
==
같이 됩니다.코드에서 일어나는 일은 다음과 같이 통역기에서 에뮬레이트됩니다.
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
그러니, 그들이 같지 않은게 당연하지, 그렇지?
말하면, ,, 음, 음, 음, 음, 음, in, in, in, in, in.a is b
상당하다id(a) == id(b)
외 '있다' 입니다.is
ID 비교에 사용됩니다.==
는 동등 비교에 사용됩니다.중요한 것은 평등(두 문자열은 같은 문자를 포함해야 함)이기 때문에 이 경우is
에 '어울리지 않다'를 .==
★★★★★★ 。
★★is
인터랙티브하게 동작하는 것은 (대부분의) 문자열 리터럴이 디폴트로 삽입되어 있는 것입니다.Wikipedia에서:
내장된 문자열은 문자열 비교 속도를 높입니다.이것은 문자열 키가 있는 해시 테이블에 크게 의존하는 애플리케이션(컴파일러나 동적 프로그래밍 언어 런타임 등)의 퍼포먼스 병목현상이 될 수 있습니다.인터닝을 사용하지 않으면 두 개의 다른 문자열이 동일한지 확인하려면 두 문자열의 모든 문자를 검사해야 합니다.이 동작은 몇 가지 이유로 느립니다.문자열 길이는 기본적으로 O(n)입니다.일반적으로 여러 메모리 영역에서 읽어야 하며 시간이 걸립니다.읽기는 프로세서 캐시를 가득 채웁니다.따라서 다른 요구에 사용할 수 있는 캐시가 적습니다.내부 문자열에서는 첫 번째 내부 작업 후에 간단한 객체 ID 테스트로 충분합니다.이것은 보통 포인터 균등화 테스트로 구현됩니다.보통 메모리 참조가 전혀 없는 단일 머신 명령일 뿐입니다.
따라서 프로그램에 동일한 값을 가진 문자열 리터럴(프로그램 소스 코드에 문자 그대로 입력된 단어, 따옴표로 둘러싸인 단어)이 2개 있으면 파이썬 컴파일러는 자동으로 문자열을 삽입하여 둘 다 동일한 메모리 위치에 저장합니다.(이러한 일이 항상 있는 것은 아니고, 그 경우의 룰도 매우 복잡하기 때문에, 프로덕션 코드의 이 동작에 의존하지 말아 주세요!)
인터랙티브 세션에서는 두 문자열이 실제로 같은 메모리 위치에 저장되기 때문에 동일한 ID를 가지기 때문에is
오퍼레이터는 예상대로 동작합니다.그러나 다른 방법으로 문자열을 작성하면(그 문자열이 완전히 같은 문자를 포함하더라도) 문자열은 동일할 수 있지만 동일한 문자열이 아닙니다. 즉, 메모리 내의 다른 위치에 저장되기 때문에 다른 ID를 가집니다.
is
입니다.==
아아아아아아아아아아아아아아아아아아아아아아.
「 」를 사용하고 is
오브젝트가 같은 오브젝트일 경우에만 결과는 true가 됩니다. ★★★★★★★★★★★★★★.==
사실대로 말하다
마지막으로 주의할 점은 함수를 사용하여 동일한 문자열에 대한 참조를 얻을 수 있습니다.
>>> from sys import intern
>>> a = intern('a')
>>> a2 = intern('a')
>>> a is a2
True
위에서 지적한 바와 같이, 당신은 다음을 사용해서는 안 됩니다.is
이치노 이것은 이 ''를 사용해야 될 수 있습니다.is
.
에 주의:intern
는 Python Python 2의 2는 Python 2로 되었습니다.sys
Python 3 의 python 。
is
와 '''입니다.==
동등성 테스트입니다.은 ①을 의미합니다.is
두 가지가 같은 것인지, 아니면 동등한 것인지를 확인하는 방법입니다.
하다'라고 하면 됩니다.person
은 아니다만약 이름이 '잭'이고 '23살'이라면, 그것은 다른 23살 잭과 맞먹지만, 같은 사람은 아니다.
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
그들은 동갑이지만 같은 사람은 아니다.문자열은 다른 문자열과 동일할 수 있지만 동일한 개체가 아닙니다.
이것은 부차적인 노트이지만 관용적인 Python에서는 다음과 같은 것을 자주 볼 수 있습니다.
if x is None:
# Some clauses
이는 Null 객체의 인스턴스(즉, 없음)가 1개 존재함을 보증하기 때문에 안전합니다.
무엇을 하고 있는지 잘 모르겠으면 '=='를 사용하십시오.이에 대해 조금 더 알고 있다면 '없음'과 같은 알려진 개체에 대해 'is'를 사용할 수 있습니다.
그렇지 않으면 왜 일이 잘 안 되는지, 왜 이런 일이 일어나는지 궁금해질 것입니다.
>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False
python 버전/실장 간에 동일하게 유지되는 것이 있는지조차 확신할 수 없습니다.
비단뱀에 대한 나의 제한된 경험으로 미루어 볼 때is
는 두 개체를 비교하여 동일한 값을 가진 두 개의 다른 개체가 아닌 동일한 개체인지 여부를 확인하기 위해 사용합니다. ==
값이 동일한지 여부를 판별하기 위해 사용합니다.
다음은 좋은 예입니다.
>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True
s1
이며 Unicode는 Unicode 문자열입니다.s2
을 사용하다같은 타입이 아니라 같은 값입니다.
나는 '있음'을 거짓으로 비교할 때 두 개의 다른 오브젝트가 사용된다는 사실과 관련이 있다고 생각한다.true로 평가될 경우 내부적으로는 동일한 객체를 사용하고 있으며 새로운 객체를 작성하지 않고 있음을 의미합니다.이는 2초 정도의 짧은 시간 내에 객체를 작성했고 최적화되어 동일한 객체를 사용하는 사이에 큰 시간 간격이 없기 때문일 수 있습니다.
연산자 '는 게 것 같다'를 사용해야 합니다.==
아니라, 이에요.is
object.string
>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>>
예에서는 '와 같은 s2를 , s2는 '하나'와 .s
처음에 'one'에 할당하지 않은 것과 같은 오브젝트를 인터프리터가 사용하지 않았기 때문에 같은 오브젝트로 할 수 있었을 것입니다.
나는 이것이 "인테드" 현이라고 알려져 있다고 믿는다.Python도 Java도 마찬가지고, C와 C++도 최적화된 모드로 컴파일 할 때 마찬가지입니다.
동일한 스트링을 2개 사용하면 2개의 스트링 오브젝트를 생성하여 메모리를 낭비하는 대신 동일한 내용을 가진 모든 내부 스트링이 동일한 메모리를 가리킵니다.
동일한 내용을 가진 두 문자열이 동일한 문자열 개체를 가리키기 때문에 Python "is" 연산자는 True를 반환합니다.이는 Java 및 C에서도 발생합니다.
이것은 메모리 절약에만 도움이 됩니다.다양한 인터프리터, 컴파일러 및 JIT 엔진으로 문자열의 동일성을 테스트할 수 없기 때문에 스트링의 동일성을 테스트할 수 없습니다.
==
이치노is
연산자는 객체 ID를 테스트하고 Python은 두 개체가 실제로 동일한 개체인지 여부를 테스트합니다(즉, 메모리 내의 동일한 주소에 살고 있습니다).
>>> a = 'banana'
>>> b = 'banana'
>>> a is b
True
예에서는 오브젝트는 이며, 둘 다 "Python"입니다.a
★★★★★★★★★★★★★★★★★」b
그것을 언급하고 있다.그 이유는 Python이 일부 문자열을 내부적으로 캐시하고 최적화로 재사용하기 때문입니다.기억 속에는 a와 b가 공유하는 '바나나'라는 문자열이 있습니다.통상의 동작을 트리거 하려면 , 보다 긴 문자열을 사용할 필요가 있습니다.
>>> a = 'a longer banana'
>>> b = 'a longer banana'
>>> a == b, a is b
(True, False)
2개의 목록을 작성하면 다음 2개의 오브젝트가 생성됩니다.
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
이 경우 두 목록은 동일한 요소를 가지고 있지만 동일하지 않기 때문에 동일한 개체가 아니기 때문에 동등하다고 할 수 있습니다.두 객체가 동일할 경우 두 객체도 동일하지만 동일할 경우 반드시 동일하지는 않습니다.
ifa
, 「」, 「」를 지정합니다.b = a
모두 오브젝트를 즉, 같은 오브젝트를 참조합니다.
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
그...is
연산자는 ID를 확인하고 == 연산자는 동일성을 확인합니다.
언어 참조:
유형은 객체 동작의 거의 모든 측면에 영향을 미칩니다.오브젝트 ID의 중요성도 영향을 받습니다.불변형 타입의 경우 새로운 값을 계산하는 조작은 실제로 동일한 타입과 값을 가진 기존 오브젝트에 대한 참조를 반환할 수 있습니다.단, 가변형 오브젝트의 경우 이는 허용되지 않습니다.예를 들어, a = 1; b = 1, a와 b는 구현에 따라 값이 1인 동일한 개체를 참조할 수도 있고 아닐 수도 있지만, c = []; d = [], c 및 d 이후에는 새로 생성된 두 개의 서로 다른 고유 빈 목록을 참조할 수 있습니다.(c = d = [ ]는 c와 d 모두에 동일한 개체를 할당합니다).
따라서 위의 문장에서 우리는 불변의 유형인 문자열이 "is"를 선택하면 실패하고 "is"를 선택하면 성공할 수 있음을 추론할 수 있습니다.
에도 마찬가지입니다.int
★★★★★★★★★★★★★★★★★」tuple
불변의 유형이기도 합니다.
is
메모리 위치를 비교합니다.객체 수준 비교에 사용됩니다.
==
이치노값 수준에서 확인하는 데 사용됩니다.
is
는 주소 을 체크합니다.
==
수준의 합니다.
is
와 '''입니다.==
는 동등성 테스트입니다(Python 매뉴얼 참조).
「」의 경우,a is b
, , , 「 」a == b
예외는 ,, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, ., 다, . ..
>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False
사용할 수 은 래, 신, 신, 신 뿐입니다.is
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
이 질문에 접근하는 동안 명확히 해야 할 기본 개념은 와 ==의 차이를 이해하는 것입니다.
"is"는 메모리 위치를 비교합니다.id(a)==id(b)인 경우 a는 true를 반환하고 그렇지 않으면 false를 반환합니다.
그래서 기억의 위치를 비교할 때 사용된다고 할 수 있습니다.반면에.
==는 결과 값만 비교하는 등식 테스트에 사용됩니다.아래 코드는 위의 이론의 예로 작용할 수 있습니다.
코드
문자열 리터럴(변수에 할당되지 않은 메모리)의 경우 메모리 주소는 그림과 같으므로 id(a)==id(b)가 됩니다.남은 건 자기 조절이에요
언급URL : https://stackoverflow.com/questions/1504717/why-does-comparing-strings-using-either-or-is-sometimes-produce-a-differe
'source' 카테고리의 다른 글
MySQL의 ROW_NUMBER() (0) | 2022.11.15 |
---|---|
php mysqli_connect: 클라이언트에 알 수 없는 인증방식 [http_sha2_password] (0) | 2022.11.15 |
정수 해시 키를 사용할 수 있는 정수 해시 함수는 무엇입니까? (0) | 2022.11.15 |
Java의 동등한 Func 및 Action (0) | 2022.11.15 |
VueJ의 1개의 컴포넌트에서 모든 이벤트를 어떻게 듣습니까? (0) | 2022.11.15 |