2012-01-18 4 views
2

가능한 중복 :파이썬에서 연산자

>>> a = "1234" 
>>> b = "1234" 
>>> a is b 
True 
>>> a = "12 34" 
>>> b = "12 34" 
>>> a is b 
False 

사람이 나를 설명 할 수 :
Python “is” operator behaves unexpectedly with integers
How is the 'is' keyword implemented in Python?

나는에 대한 질문이

파이썬에서 연산자 "입니다" 왜 그렇게 되니? 또한 나는 이해할 수 없다, 그것은 "연산자"가 객체의 메모리 주소만을 비교할 필요가 있다고 말하면 "a is b"라는 표현이 참입니까?

+1

이것은 여기에 자세하게 설명되어 있습니다. http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers – Yuushi

+0

여기에 또 다른 [http : // stackoverflow. com/questions/2987958/how-is-the-is-of-python] (http://stackoverflow.com/questions/2987958/how-is-the-is-keyword-implemented-in-python) – Matt

답변

3

is은 항등 연산자가 아닙니다. 두 변수가 동일한 객체를 참조하는지 확인합니다. 당신이 인 경우에이 작업을 수행합니다 : 그들은 같은 객체를 참조하기 때문에

a = "12 34' 
b = a 

a is bTrue 될 것이다.

제시 한 사례는 Python 인터프리터의 구현 세부 사항 때문입니다. 문자열은 불변이므로 어떤 경우에는 동일한 문자열을 두 개 생성하면 동일한 객체에 대한 참조가됩니다. 즉, 첫 번째 경우에는 파이썬 인터프리터가 "1234"의 단일 복사본 만 만들고 ab은 목적. 두 번째 경우에는 해석기가 두 개의 복사본을 만듭니다. 이는 인터프리터가 문자열을 생성하고 처리하는 방식으로 인해 구현 세부 사항에 의존해서는 안됩니다. docs에서

1

:

운영자 is 및 개체의 정체성에 대한 is not 시험 : x is y에 해당하는 경우에만 x와 y가 같은 오브젝트하는 경우. x is not y은 역의 진리 값을 산출합니다.

id 기능이있어 차이를 보여 두 물체가 동일한 경우

>>> a = "1234" 
>>> b = "1234" 
>>> a is b 
True 
>>> id(a) 
140340938833512 
>>> id(b) 
140340938833512 

>>> a = "12 34" 
>>> b = "12 34" 
>>> a is b 
False 
>>> id(a) 
140340938833568 
>>> id(b) 
140340938833624 
1

is 작업자가 식별하기 위해 사용된다 - 즉 : 내부적가 동일한 메모리 위치에 저장된다.

파이썬 구현은 문자열, 정수 및 기타 숫자와 같은 변경 불가능한 객체를 자유롭게 최적화하여 동일한 객체를 인스턴스화 할 때 이전에 있던 객체를 다시 사용할 수 있도록합니다. 예를 들어 cPython (표준 구현)에서 "n"번째 정수 (실제 임계 값을 기억하지 못함)는 항상 메모리에 단일 인스턴스로 유지되므로 작은 정수의 경우 "is"는 항상 "참" .

물론 is 연산자는 을 의미하지 않으므로을이 방식으로 사용해야합니다. 문자열이나 정수가 내부적으로 캐시되는지 여부는 신경 쓰지 않아야합니다. (비록 내장 함수 (intern)이 있지만이 방법으로 문자열이나 객체를 캐시하는 인터프리터를 암시합니다).

is을 사용하는 아이디어는 한 개체가 실제로 다른 장소에있는 것과 동일한 지 확인하는 것입니다.객체가 동등한지를 일관되게 확인하려면 항상이 같음 연산자 ==을 사용해야합니다.