source

"=="와 "is"는 차이가 있습니까?

goodcode 2022. 9. 18. 21:35
반응형

"=="와 "is"는 차이가 있습니까?

구글푸가 실패했어요.

Python에서는 다음 두 테스트가 동등합니까?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

a 「 「 「」 「a」 )에 , 이것이 합니까?list say? say? say? say? say?

자, 이게 제 질문에 대한 답입니다.

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

★★★★★★★★★★★★★★★★★.==은 " " " 입니다.is같은 물체인지 아닌지를 테스트하는 것인가요?

isTrue 오브젝트(메모리를 경우, 「」(메모리 내), 「」(메모리 내), 「」(메모리 내),==변수에 의해 참조되는 객체가 동일한 경우.

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

# Make a new copy of list `a` via the slice operator, 
# and assign it to variable `b`
>>> b = a[:] 
>>> b is a
False
>>> b == a
True

이 경우 Python은 구현 세부사항인 작은 정수 개체를 캐시하기 때문에 두 번째 테스트만 작동합니다.큰 정수의 경우, 이것은 기능하지 않습니다.

>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

스트링 리터럴도 마찬가지입니다.

>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True

질문도 봐주세요.

이 있습니다.== ★★★★★★★★★★★★★★★★★」is.

  • ==가치평등을 위한 것입니다.두 개체의 값이 동일한지 여부를 알고 싶을 때 사용합니다.
  • is참조 평등을 위한 것입니다.두 개의 참조가 동일한 개체를 참조하는지 여부를 알고 싶을 때 사용합니다.

일반적으로 단순 유형과 비교할 때는 일반적으로 값이 동일한지 여부를 검사하기 때문에 다음을 사용해야 합니다.== 이 입니다(x는 x의 값이 인지 아닌지를 확인하는 ==의 유무가 .x말 2.어느새 2번과 .


: 구현에 "CPython"을 사용하면 치 않은 를 얻을 수 is정수에 대한 기준 동일성 비교:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

대로입니다.a ★★★★★★★★★★★★★★★★★」b값은 같지만 개별 엔티티입니다.지만만 이???

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

이것은 이전의 결과와 일치하지 않는다.이게 무슨 일이야?Python의 참조 구현은 -5 범위의 정수 객체를 캐시하는 것으로 나타났습니다.256은 성능상의 이유로 싱글톤 인스턴스로 사용됩니다.다음은 이를 보여주는 예입니다.

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

은 또 로, 른른른른른른른른을 사용하지 않는 것입니다.is 가치평등을 위해 잘못 사용할 경우 동작은 구현에 맡겨집니다.

== ★★★★★★★★★★★★★★★★★」isPython?

네, 그들은 매우 중요한 차이를 가지고 있어요.

: 동등성 확인 - 동일한 오브젝트(같은 오브젝트일 필요는 없음)가 동등하다고 테스트되는 것을 의미합니다==.설명서에 기재되어 있는 바와 같이:

연산자 <, >, ==, >=, <= 및 !=는 두 개체의 값을 비교합니다.

: identity를 확인합니다.메모리에 보관되어 있는 오브젝트가 오브젝트라는 의미입니다is. 문서에는 다음과 같이 기재되어 있습니다.

" "is ★★★★★★★★★★★★★★★★★」is notID : " " " ID " " :x is y 경우, 이만 해당됩니다.x ★★★★★★★★★★★★★★★★★」y같은 객체입니다.는 "ID"를 됩니다.id()★★★★★★ 。x is not y아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

따라서 ID 체크는 오브젝트 ID의 동일성을 체크하는 것과 같습니다.그것은,

a is b

다음과 같습니다.

id(a) == id(b)

서 ''는id는, 「오브젝트간에 라고 하는입니다( 「동시에 존재하는 오브젝트간에 일의가 보증된다」를 참조).help(id)및 where )는 다음과 같습니다.a ★★★★★★★★★★★★★★★★★」b임의의 객체입니다.

기타 사용방법

이러한 비교는 의미론에 사용해야 합니다.is==평등을 견제하기 위해.

사용합니다.is할 때 이 됩니다.이 기능은 일반적으로 설명서에서 "싱글톤"이라고 하는 메모리에 한 번만 존재해야 하는 개체를 확인할 때 유용합니다.

「 」의예:is다음을 포함합니다.

  • None
  • enum values(enum 모듈에서 Enum을 사용하는 경우)
  • 통상 모듈
  • 보통 클래스 정의에서 생성되는 클래스 객체
  • 일반적으로 함수 정의에 따라 생성되는 함수 객체
  • 메모리에 한 번만 존재해야 하는 다른 모든 것(일반적으로 모든 싱글톤)
  • 정체성에 의해 원하는 특정 객체

==다음을 포함합니다.

  • 정수 포함 숫자
  • 줄들
  • 리스트
  • 놓다
  • 사전
  • 사용자 지정 가변 개체
  • 대부분의 경우 기타 빌트인 불변의 객체

==원하는 객체가 같은 객체가 아닌 동등한 객체가 될 수 있습니다.

PEP 8 방향

표준 라이브러리의 공식 Python 스타일 가이드인 PEP 8에서는 다음 두 가지 사용 사례도 언급하고 있습니다.

음음음음음 compar compar like like like like 와 같은 None 해야 한다is ★★★★★★★★★★★★★★★★★」is not 연산자를 하지 않습니다 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

도 주의하세요.if xif x is not None-- 이 -- 로 되어 있는 되는 None하다다른 값에는 부울 컨텍스트에서 false일 수 있는 유형(예: 컨테이너)이 있을 수 있습니다.

동일성으로부터 평등성을 추론하다

ifis일반적으로 동등성은 추론할 수 있습니다.논리적으로 오브젝트가 그 자체일 경우, 그 오브젝트는 그 자신과 동등하게 테스트해야 합니다.

이이지만, 이 논리는 '에합니다.__eq__특별한 방법의사 말처럼

비교 ( 「」 「」 「」 )== ★★★★★★★★★★★★★★★★★」!=는 오브젝트의 ID를 기반으로 합니다.인스턴스의 균등의 유사한 정체성 결과에 그러므로, 평등에 비해, 인스턴스의 불평등의 다른 정체성 결과에 같음 비교.따라서 동일 동일성을 가진 사례의 평등 비교는 평등, 다른 동일성을 가진 사례의 평등 비교는 불평등을 초래한다.이 기본 행위에 대한 동기는 욕망이 모든 개체가 되어야 한다 재귀(즉 cm는 yy== x을 내포한다.).이러한 기본 동작의 동기는 모든 물체가 반사적이어야 한다는 욕구입니다(즉, x는 x == y를 의미함).

일관성을 유지하기 위해 다음 사항을 권장합니다.

평등 비교는 반사적이어야 한다.즉, 동일한 오브젝트는 동등하게 비교해야 합니다.

x is y의미를 내포하고 암시하다x == y

커스텀 오브젝트의 디폴트 동작은 다음과 같습니다.

>>> class Object(object): pass
>>> obj = Object()
>>> obj2 = Object()
>>> obj == obj, obj is obj
(True, True)
>>> obj == obj2, obj is obj2
(False, False)

반대되는 것도 보통 사실이지만, 어떤 것이 동일하지 않은 것으로 테스트되면, 보통 같은 물체가 아니라고 추론할 수 있습니다.

동등성 검정을 사용자 정의할 수 있으므로 이 추론이 모든 유형에 적용되는 것은 아닙니다.

예외

두드러진 예외는주목할만한예외는 다음과 같습니다.nan-언제나 그 자체와 같지 않습니다:-항상 자신과것으로 테스트합니다 않은 동일하지를 테스트합니다.

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

아이덴티티 체크는 동등성 체크보다 훨씬 빠를 수 있습니다(멤버를 재귀적으로 체크해야 할 수도 있습니다).

그러나 둘 이상의 오브젝트가 동등한 것을 찾을 수 있는 경우에는 동등함을 대체할 수 없습니다.

참고 목록과 tuples의 평등을 비교하는 그 개체의 정체성이 동등한(왜냐하면 이것은 빠른 수표)을 짐작할 것이다.리스트와 튜플의 동일성을 비교하면 오브젝트의 ID가 동일하다고 가정합니다(이것은 고속 체크이기 때문입니다).만약 논리는 일치하지 않는 것을논리에일관성이 없는발생할 수 있습니다 모순이 경우는 이건 모순을 만들 수 있습니다.nan::

>>> [nan] == [nan]
True
>>> (nan,) == (nan,)
True

주의사항:

문제는질문을 사용하려고 합니다를 사용하려 하고 있다.is정수는 비교할입니다.정수를 비교합니다.너희도 서로 참조에 의해 도출한 것이 정수의 인스턴스와 같은 인스턴스다고 생각해서 안된다.정수의 인스턴스가 다른 참조에서 얻은 인스턴스와 동일하다고 가정해서는 안 됩니다.이 이야기는 그 이유를 설명해준다.

코멘터는 Python에서 평등을 확인하는 대신 작은 정수(-5~256)가 싱글톤이라는 사실에 의존하는 코드를 가지고 있었다.

와, 이것은 몇 가지 악의적인 버그로 이어질 수 있습니다.a가 b인지 확인하는 코드가 몇 개 있었는데, a와 b는 보통 작은 숫자이기 때문에 내가 원하는 대로 작동했습니다.a와 b가 캐시되지 않을 정도로 크기 때문에 이 버그는 생산 6개월 만에 오늘에야 발생했습니다.– gwg

개발 중에 효과가 있었다.몇 번인가 지나갔을지도 몰라.

그리고 그것은 생산에서 작동했다 - 코드가 256보다 큰 정수를 체크할 때까지, 그리고 그 시점에서 생산에서 실패했다.

이는 코드 리뷰 또는 스타일 체커에서 발견되었을 수 있는 생산 실패입니다.

내가 강조할게: 정수를 비교하는데 사용하지 마.

==합니다.is두 개체가 완전히 동일한 개체인지 여부를 결정합니다.

차이가 있나요?is ★★★★★★★★★★★★★★★★★」==

== ★★★★★★★★★★★★★★★★★」is★★★★★★★★★★★★★★★★★★★!다음과 같이 합니다.

  • ==에 객체의 값을 비교합니다.
  • is에 객체의 참조를 나타냅니다.

에서는 오브젝트를 이 경우 Python은 오브젝트를 합니다.value1 ★★★★★★★★★★★★★★★★★」value2 언급하다int1000:

value1 = 1000
value2 = value1

enter image description here

★★★★★★★★★★★★★★★★★★value2 대상을 is ★★★★★★★★★★★★★★★★★」== 주다True:

>>> value1 == value2
True
>>> value1 is value2
True

음음 in음 in in in in in in 。value1 ★★★★★★★★★★★★★★★★★」value2 것을 언급하다int인스턴스(양쪽이 같은 정수를 저장하는 경우라도):

>>> value1 = 1000
>>> value2 = 1000

enter image description here

값이 격납되어 있기 에, 「」(정수)가 격납되어 있습니다.== 되다True을 사용하다, <고객명>님isFalse하다

>>> value1 == value2
True
>>> value1 is value2
False

언제 사용할까요?

일반적으로는 「일부러」입니다.is훨씬 빠른 비교입니다.그렇기 때문에 CPython은 작은 정수, 일부 문자열 등의 특정 개체를 캐시(또는 재사용하는 것이 더 나을 수 있습니다)합니다.그러나 이는 경고 없이 언제든지 변경될 수 있는 구현 세부 사항으로 취급해야 합니다.

다음과 같은 경우에만 사용해야 합니다.

  • 두 개체가 동일한 개체(같은 "값"뿐만 아니라)인지 확인하려고 합니다.예를 들어 싱글톤 객체를 상수로 사용하는 경우가 있습니다.

  • 값을 파이썬 상수와 비교하려고 합니다.Python의 상수는 다음과 같습니다.

    • None
    • True1
    • False1
    • NotImplemented
    • Ellipsis
    • __debug__
    • : "클래스:int is int ★★★★★★★★★★★★★★★★★」int is float)
    • 내장 모듈 또는 서드파티 모듈에는 추가 상수가 있을 수 있습니다.예를 들어 NumPy 모듈에서)

다른 모든 경우에는 동등성을 확인하는 데 사용해야 합니다.

동작을 커스터마이즈할 수 있습니까?

에는 몇 가지 측면이 ==다른 답변에서는 언급되지 않은 내용입니다.피톤스 "데이터 모델"의 일부입니다.즉, 이 방법을 사용하여 동작을 맞춤화할 수 있습니다.예를 들어 다음과 같습니다.

class MyClass(object):
    def __init__(self, val):
        self._value = val

    def __eq__(self, other):
        print('__eq__ method called')
        try:
            return self._value == other._value
        except AttributeError:
            raise TypeError('Cannot compare {0} to objects of type {1}'
                            .format(type(self), type(other)))

이것은 이 메서드가 실제로 다음과 같이 불리고 있음을 설명하기 위한 인위적인 예에 불과합니다.

>>> MyClass(10) == MyClass(10)
__eq__ method called
True

이 없는 )__eq__에 .__eq__is:

class AClass(object):
    def __init__(self, value):
        self._value = value

>>> a = AClass(10)
>>> b = AClass(10)
>>> a == b
False
>>> a == a

실천하는합니다.__eq__커스텀 수업의 레퍼런스 비교보다 더 많은 것을 원하신다면!

, 맞춤화는 할 수 없습니다.is체크합니다.참조가 같은 경우에만 항상 비교됩니다.

이러한 비교는 항상 부울을 반환합니까?

★★★★★★★★★★★★★★★★★★__eq__ 또는할 수 반환에 한정되지 않습니다.True ★★★★★★★★★★★★★★★★★」False. 어떤 것이든 반환할 수 있습니다(대부분의 경우 부울을 반환할 것입니다.

의 경우 NumPy는==배열을 합니다.

>>> import numpy as np
>>> np.arange(10) == 2
array([False, False,  True, False, False, False, False, False, False, False], dtype=bool)

★★★★★★★★★★★★★★★★★.is 반환됩니다.True ★★★★★★★★★★★★★★★★★」False!


1 Aaron Hall이 코멘트에서 언급했듯이:

도 하지 것이 좋습니다.is True ★★★★★★★★★★★★★★★★★」is False체크하는 이유는 보통 이러한 "sublic"을 조건을 암묵적으로 부울로 변환하는 컨텍스트(예를 들어,if이치노 ★★★★★★★★★★★★★★★★.is True비교와 암묵적인 부울 캐스트는 부울 캐스트를 하는 것보다 더 많은 작업을 하고 있습니다.그리고 당신은 자신을 부울로 제한합니다(이것은 비단뱀으로 간주되지 않습니다).

PEP8의 설명처럼:

을 " "와 True ★★★★★★★★★★★★★★★★★」False를 사용합니다.==.

Yes:   if greeting:
No:    if greeting == True:
Worse: if greeting is True:

그들은 완전히 다르다. isID 를 하고, ID 는 ID 를 체크합니다.==는 동등성(두 오퍼랜드의 유형에 따라 달라지는 개념)을 확인합니다.

의 일치일 is"는 작은 정수(예: 5 == 4+1)에서 올바르게 작동하는 것으로 보입니다.이는 CPython이 정수를 싱글톤으로 하여 (-5 ~256) 범위의 정수를 저장하기 위한 최적화를 하기 때문입니다.이 동작은 완전히 구현에 의존하며 모든 종류의 사소한 변환 작업에서도 유지된다는 보장은 없습니다.

예를 들어 Python 3.5는 짧은 문자열도 싱글톤으로 만들지만 슬라이스하면 이 동작이 중단됩니다.

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False

https://docs.python.org/library/stdtypes.html#comparisons

is신원 확인 테스트==동등성 검정

각(작은) 정수 값은 단일 값에 매핑되므로 3개마다 동일하고 동일합니다.이것은 구현 세부 사항이며 언어 사양의 일부가 아닙니다.

정답입니다.is연산자는 두 개체의 ID를 비교합니다.==연산자는 두 개체의 값을 비교합니다.

오브젝트의 ID는 일단 작성되면 변경되지 않습니다.메모리에 있는 오브젝트의 주소로 간주할 수 있습니다.

오브젝트 값의 비교 동작을 제어하려면__cmp__같은 방법 또는 풍부한 비교 방법__eq__.

Stack Overflow 질문 Python의 "is" 연산자가 정수로 예기치 않게 동작합니다.

결론부터 말하자면is"는 그것들이 서로 동일할 뿐만 아니라 동일한 개체인지 확인합니다(256보다 작은 숫자는 특수한 경우입니다).

한마디로 말해서is는 2개의 참조가 같은 오브젝트를 가리키고 있는지 여부를 체크합니다.==는 두 개체의 값이 동일한지 여부를 확인합니다.

a=[1,2,3]
b=a        #a and b point to the same object
c=list(a)  #c points to different object 

if a==b:
    print('#')   #output:#
if a is b:
    print('##')  #output:## 
if a==c:
    print('###') #output:## 
if a is c:
    print('####') #no output as c and a point to different object 

이 게시물의 다른 사람들이 질문에 상세하게 대답할 때, 두 사람 사이의 차이입니다.==그리고.is오브젝트나 변수를 비교하기 위해, 나는 주로 비교하고 싶다.is그리고.== 다른 결과를 낼 수 있는 문자열들을 위해 프로그래머들이 그것들을 주의 깊게 사용할 것을 권하고 싶다.

문자열 비교를 위해 반드시 다음을 사용하십시오.==대신is:

str = 'hello'
if (str is 'hello'):
    print ('str is hello')
if (str == 'hello'):
    print ('str == hello')

출력:

str is hello
str == hello

, 다음 예에서는==그리고.is다른 결과를 얻을 수 있습니다.

str2 = 'hello sam'
    if (str2 is 'hello sam'):
        print ('str2 is hello sam')
    if (str2 == 'hello sam'):
        print ('str2 == hello sam')

출력:

str2 == hello sam

결론과 분석:

사용하다is신중하게 줄을 비교합니다.부터is오브젝트를 비교하기 위해 Python 3+에서는 문자열과 같은 모든 변수가 오브젝트로 해석되기 때문에 위의 단락에서 무슨 일이 일어났는지 살펴보겠습니다.

python에는 개체의 수명 동안 고유한 상수를 보여주는 함수가 있습니다.이 ID는 Python 인터프리터의 백엔드에서 사용하여 두 개체를 비교합니다.is키워드를 지정합니다.

str = 'hello'
id('hello')
> 140039832615152
id(str)
> 140039832615152

그렇지만

str2 = 'hello sam'
id('hello sam')
> 140039832615536
id(str2)
> 140039832615792

John Feminella가 말했듯이, 값을 비교하는 것이 목적이기 때문에 대부분의 경우 ==와 !=를 사용합니다.나머지 시간에는 무엇을 할 것인지 분류하고 싶습니다.

NoneType 인스턴스는 1개뿐입니다.독신자는 없다.결과적으로foo == None그리고.foo is None같은 의미입니다.하지만, 그is테스트는 더 빠르고 피톤식 관습은 사용하는 것이다.foo is None.

자기성찰이나 가비지 컬렉션을 만지작거리거나 커스텀 빌트 스트링 인터닝 가젯이 동작하고 있는지 여부를 체크하고 있는 경우는, 다음의 사용 사례를 가지고 있을 가능성이 있습니다.foobar.

True와 False도 (현재는) 싱글톤이지만,foo == True용도가 없습니다.foo is True.

그들 대부분은 이미 요령 있게 대답했다.(내 이해와 실험에 기초하지만 문서화된 출처에서 나온 것이 아님) 추가 메모로서, 이 진술은

== 변수에서 참조하는 객체가 동일한 경우

상기의 답변은 로 읽혀져야 한다.

== 변수에서 참조하는 객체가 동일하고 동일한 유형/클래스에 속하는 객체가 있는 경우

아래 테스트를 통해 이 결론에 도달했습니다.

list1 = [1,2,3,4]
tuple1 = (1,2,3,4)

print(list1)
print(tuple1)
print(id(list1))
print(id(tuple1))

print(list1 == tuple1)
print(list1 is tuple1)

여기서 목록과 튜플의 내용은 같지만 유형/클래스가 다릅니다.

python의 is와 equals(==)의 차이

is 연산자는 등식 연산자와 동일한 것처럼 보일 수 있지만 동일하지는 않습니다.

는 두 변수가 동일한 개체를 가리키는지 확인하는 반면 == 기호는 두 변수의 값이 동일한지 확인합니다.

따라서 이 연산자가 True를 반환하는 경우 등식은 True이지만 그 반대는 True일 수도 있고 아닐 수도 있습니다.

다음은 유사성과 차이점을 보여주는 예입니다.

>>> a = b = [1,2,3]
>>> c = [1,2,3]
>>> a == b
True
>>> a == c
True
>>> a is b
True
>>> a is c
False
>>> a = [1,2,3]
>>> b = [1,2]
>>> a == b
False
>>> a is b
False
>>> del a[2]
>>> a == b
True
>>> a is b
False
Tip: Avoid using is operator for immutable types such as strings and numbers, the result is unpredictable.

언급URL : https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is

반응형