programing

"is" 연산자 이해

telecom 2023. 7. 29. 08:12
반응형

"is" 연산자 이해

is연산자가 변수의 값과 일치하지 않지만 인스턴스(instance) 자체가 일치합니다.

그것은 정말로 무엇을 의미합니까?

는 나두변수선니다습언했라는 의 두 했습니다.x그리고.y하는데, 제가 할 때 합니다.is교환입니다.

해명이 필요해요여기 제 코드가 있습니다.

x = [1, 2, 3]
y = [1, 2, 3]

print(x is y)  # It prints false!

당신은 무엇을 잘못 이해했습니다.is측정 시스템 테스트두 변수가 동일한 값을 가지는지 여부가 아니라 두 변수가 동일한 개체를 가리키는지 여부를 검정합니다.

조작자 설명서에서 다음을 확인합니다.

is그리고.is notID 테스트: :x is y다음과 같은 경우에만 참입니다.x그리고.y동일한 개체입니다.

을 합니다.==연산자 대신:

print(x == y)

은 인합니다를 인쇄합니다.True.x그리고.y의 개별 목록:

x[0] = 4
print(y)  # prints [1, 2, 3]
print(x == y)   # prints False

기능을 사용하면 다음과 같은 것을 알 수 있습니다.x그리고.y서로 다른 식별자 사용:

>>> id(x)
4401064560
>>> id(y)
4401098192

하지만 네가 할당한다면,yx그런 다음 두 가지 모두 동일한 개체를 가리킵니다.

>>> x = y
>>> id(x)
4401064560
>>> id(y)
4401064560
>>> x is y
True

그리고.is다. 둘 다 동일한 개체입니다. 를 합니다. 반환됩니다.True.

Python에서 이름은 값을 참조하는 레이블일 뿐입니다. 여러 이름이 동일한 개체를 가리킬 수 있습니다.is두 이름이 하나의 개체와 동일한 개체를 가리키는지 여부를 나타냅니다.==에서는 두 이름이 동일한 값을 가진 개체를 참조하는지 여부를 보여 줍니다.

또 다른 중복 항목은 두 개의 동일한 문자열이 일반적으로 동일하지 않은 이유를 묻는 것이었는데, 여기서는 실제로 답변하지 않았습니다.

>>> x = 'a' 
>>> x += 'bc'
>>> y = 'abc'
>>> x == y
True
>>> x is y
False

그렇다면, 왜 그것들은 같은 끈이 아닐까요?특히 이것을 고려할 때:

>>> z = 'abc'
>>> w = 'abc'
>>> z is w
True

두 번째 부분은 잠시 뒤로 미루겠습니다.어떻게 첫번째 것이 사실일 수 있습니까?

값을 인 " table"이 이 "intering table"인 "intering table"로 새을 만들 때마다 "intering table"이 합니다.'abc'당신은 같은 물건을 돌려받습니다.위키피디아는 인턴이 어떻게 작동하는지에 대한 더 자세한 논의를 하고 있습니다.

Python에는 문자열 인터닝 테이블이 있습니다. 이 메소드를 사용하여 문자열을 수동으로 인터닝할 수 있습니다.

사실, Python은 모든 불변 유형을 자동으로 내부화할 수 있지만, 그렇게 할 필요는 없습니다.서로 다른 구현은 서로 다른 가치를 내포합니다.

Cython(사용하는 구현체를 모를 경우 사용하는 구현체)은 작은 정수와 다음과 같은 특수 싱글톤을 자동 인턴합니다.False그러나 문자열(또는 큰 정수, 작은 튜플 또는 다른 모든 것)은 아닙니다.이를 쉽게 확인할 수 있습니다.

>>> a = 0
>>> a += 1
>>> b = 1
>>> a is b
True
>>> a = False
>>> a = not a
>>> b = True
a is b
True
>>> a = 1000
>>> a += 1
>>> b = 1001
>>> a is b
False

좋아요, 하지만 왜 그랬을까요?z그리고.w똑같습니까?

그것은 자동으로 인터프리터가 아니라 컴파일러가 값을 접는 것입니다.

동일한 컴파일 시간 문자열이 동일한 모듈에 두 번 나타나는 경우(정확히 정의하기 어려운 의미), 문자열 리터럴과 동일하지 않은 이유는r'abc','abc',그리고.'a' 'b' 'c'모든 다른 리터럴이지만 동일한 문자열입니다. 그러나 직관적으로 이해하기 쉽습니다.) 컴파일러는 두 개의 참조가 있는 문자열 인스턴스 하나만 만듭니다.

사실 컴파일러는 더 멀리 갈 수 있습니다.'ab' + 'c'으로 변환할 수 있습니다.'abc'옵티마이저에 의해, 이 경우 그것은 함께 접힐 수 있습니다.'abc'상수를 지정합니다.

다시 말하지만, 이것은 Python이 허용되지만 필수는 아닙니다.그러나 이 경우 Cython은 항상 작은 줄(그리고 작은 튜플)을 접습니다.(비록 대화형 인터프리터의 문별 컴파일러는 module-at-a-t-t-t-t-t-t-t-t-t-t-t-time 컴파일러와 동일한 최적화를 실행하지 않기 때문에 정확히 같은 결과를 대화형으로 볼 수 없습니다.)


그렇다면, 프로그래머로서 이것에 대해 무엇을 해야 할까요?

음… 아무것도.불변하는 두 값이 동일한지 여부에 대해 거의 관심을 가질 이유가 없습니다.언제 사용할 수 있는지 알고 싶다면a is ba == b당신은 잘못된 질문을 하고 있습니다. 상항사를 하세요.a == b는 다음과 같습니다.

  • 과 싱톤 글값과 더음읽쉬와 같은 싱글톤 값과 더 .x is None.
  • 값의 하는지 알아야 할때.x영향을 미칠 것입니다.y.

is실제로 동일한 개체인 경우에만 true를 반환합니다.동일한 경우 하나에 대한 변경사항이 다른 하나에도 표시됩니다.여기 차이점의 예가 있습니다.

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> print x is y
False
>>> z = y
>>> print y is z
True
>>> print x is z
False
>>> y[0] = 5
>>> print z
[5, 2, 3]

중복된 질문으로 인해 이 비유는 효과가 있을 수 있습니다.

# - Darling, I want some pudding!
# - There is some in the fridge.

pudding_to_eat = fridge_pudding
pudding_to_eat is fridge_pudding
# => True

# - Honey, what's with all the dirty dishes?
# - I wanted to eat pudding so I made some. Sorry about the mess, Darling.
# - But there was already some in the fridge.

pudding_to_eat = make_pudding(ingredients)
pudding_to_eat is fridge_pudding
# => False

is그리고.is notPython의 두 개의 ID 연산자입니다.is연산자는 변수의 값을 비교하지 않고 변수의 동일성을 비교합니다.고려 사항:

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> hex(id(a))
'0x1079b1440'
>>> hex(id(b))
'0x107960878'
>>> a is b
False
>>> a == b
True
>>>

위의 예는 ID(Cpython의 메모리 주소일 수도 있음)가 둘 다 다르다는 것을 보여줍니다.a그리고.b(값이 동일하더라도).그렇기 때문에 당신이a is b두 피연산자의 ID가 일치하지 않아 false를 반환합니다.하지만 당신이 말할 때a == b그것은 진실로 돌아옵니다 왜냐하면==작업은 두 피연산자 모두에 동일한 값이 할당되어 있는지 여부만 확인합니다.

흥미로운 예(추가 등급의 경우):

>>> del a
>>> del b
>>> a = 132
>>> b = 132
>>> hex(id(a))
'0x7faa2b609738'
>>> hex(id(b))
'0x7faa2b609738'
>>> a is b
True
>>> a == b
True
>>>

위의 예에서, 비록a그리고.b두 가 있 습 다 니 가 변 수 지 다 , ▁are 니 ▁two ▁different 있두 습a is b된 환된반True은 그이는유의 입니다.a이라int그것은 불변의 물체입니다. python은를 서메그 python (모리를절은위해기약다니할습)에 할당했습니다.b동일한 값으로 생성된 경우. 이하고 그서이경변의수들정일체고치했이래성우에는,▁so,a is b알고 보니True.

이는 모든 불변 개체에 적용됩니다.

>>> del a
>>> del b
>>> a = "asd"
>>> b = "asd"
>>> hex(id(a))
'0x1079b05a8'
>>> hex(id(b))
'0x1079b05a8'
>>> a is b
True
>>> a == b
True
>>>

도움이 되길 바랍니다.

x is y과 같습니다.id(x) == id(y)개체의 동일성을 비교합니다.

@ @tomasz-kurgan은 @tomasz-kurgan입니다.is연산자가 특정 개체에 대해 비정상적으로 동작합니다.

예.

>>> class A(object):
...   def foo(self):
...     pass
... 
>>> a = A()
>>> a.foo is a.foo
False
>>> id(a.foo) == id(a.foo)
True

참조;
https://docs.python.org/2/reference/expressions.html#://docs.python.org/2/reference/expressions.html#is-not
https://docs.python.org/2/reference/.html#id24https ://docs.python.org/2/reference/expressions.html#id24

여기서 작은 정수를 확인할 수 있습니다.257 이상의 숫자는 작은 int가 아니므로 다른 개체로 계산됩니다.

사용하는 것이 더 좋습니다.==대신에 이 경우에는.

자세한 내용은 다음을 참조하십시오. http://docs.python.org/2/c-api/int.html

X는 배열을 가리키고 Y는 다른 배열을 가리킵니다. 배열들은, 이한어동일만지하는레이러,만▁those▁are지▁the,is연산자는 동일하지 않은 포인터를 볼 것입니다.

개체 ID, 즉 변수가 메모리의 동일한 개체를 참조하는지 여부를 비교합니다. ▁likes마▁it'은그.==Java 또는 C로 표시됩니다(포인터 비교 시).

과일에 대한 간단한 예

fruitlist = [" apple ", " banana ", " cherry ", " durian "]
newfruitlist = fruitlist
verynewfruitlist = fruitlist [:]
print ( fruitlist is newfruitlist )
print ( fruitlist is verynewfruitlist )
print ( newfruitlist is verynewfruitlist )

출력:

True
False
False

노력하면

fruitlist = [" apple ", " banana ", " cherry ", " durian "]
newfruitlist = fruitlist
verynewfruitlist = fruitlist [:]
print ( fruitlist == newfruitlist )
print ( fruitlist == verynewfruitlist )
print ( newfruitlist == verynewfruitlist )

출력은 다릅니다.

True
True
True

이는 == 연산자가 변수의 내용만 비교하기 때문입니다.두 변수의 동일성을 비교하려면 is 연산자를 사용합니다.

식별 번호 인쇄하기

print ( id( variable ) )

is연산자는 영어 버전에 불과합니다.==왜냐하면 두 목록의 ID가 다르기 때문에 답은 거짓입니다.시도할 수 있습니다.

a=[1,2,3]
b=a
print(b is a )#True

*두 목록의 ID가 동일하기 때문입니다.

언급URL : https://stackoverflow.com/questions/13650293/understanding-the-is-operator

반응형