"is" 연산자 이해
그
is
연산자가 변수의 값과 일치하지 않지만 인스턴스(instance) 자체가 일치합니다.
그것은 정말로 무엇을 의미합니까?
는 나두변수선니다습언했라는 의 두 했습니다.x
그리고.y
하는데, 제가 할 때 합니다.is
교환입니다.
해명이 필요해요여기 제 코드가 있습니다.
x = [1, 2, 3]
y = [1, 2, 3]
print(x is y) # It prints false!
당신은 무엇을 잘못 이해했습니다.is
측정 시스템 테스트두 변수가 동일한 값을 가지는지 여부가 아니라 두 변수가 동일한 개체를 가리키는지 여부를 검정합니다.
조작자 설명서에서 다음을 확인합니다.
연
is
그리고.is not
ID 테스트: :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
하지만 네가 할당한다면,y
x
그런 다음 두 가지 모두 동일한 개체를 가리킵니다.
>>> 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 b
에 a == 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 not
Python의 두 개의 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
'programing' 카테고리의 다른 글
utf8mb3 테이블에 이모지를 저장할 수 없습니다...MariaDB 10.6 업데이트 이후 하룻밤 사이에 nd_mysqli로 전환 (0) | 2023.07.29 |
---|---|
활성 도커 컨테이너의 포트 노출 (0) | 2023.07.29 |
안드로이드에서 그라데이션 배경을 만드는 방법 (0) | 2023.07.29 |
어레이, 해시 테이블 및 사전을 생성하시겠습니까? (0) | 2023.07.29 |
Oracle: 자정 전 현재 날짜(오늘)를 선택하는 방법은 무엇입니까? (0) | 2023.07.29 |