2011-04-25 2 views
7

구문 !=is not의 차이점에 대해 잘 모르겠습니다. 내가 지능형리스트에 is not를 사용할 때, 그것이 내가 !=를 사용하는 경우와 다른 결과를 생성Python : 차이점은! =와 "is not"입니다.

>>> s = 'a' 
>>> s != 'a' 
False 
>>> s is not 'a' 
False 

그러나 : 그들은 같은 일을 할 것으로 보인다.

>>> s = "hello" 
>>> [c for c in s if c is not 'o'] 
['h', 'e', 'l', 'l', 'o'] 
>>> [c for c in s if c != 'o'] 
['h', 'e', 'l', 'l'] 

o는 두 번째 목록을 첫 번째 목록에 포함되어 있지만 되었나요? 개체의 정체성에 대한

+3

이 두 연산자에 대한 파이썬 언어 참조를 살펴본 결과, 무엇을 보았습니까? 이것은 분명해 보입니다 : http://docs.python.org/reference/expressions.html#notin. 어떤 부분이 너를 혼란스럽게 했는가? –

+0

@ FChannel72 나는 **의 존재가 **''c ''가 아닌''id ''의 평가를 자극하는 표현에 있다고 생각한다. 숫자 (주소 id (c))는 문자열이 아니므로 결과는 True가되므로 ** c **가 작성 목록에 보관됩니다. – eyquem

+0

@ FChannel72 문제는 결과를 확인하고 두 표현에 대해''[ 'h', 'e', ​​'l', 'l']''를 얻는 것입니다. 나는 이유가 궁금 해서요. "존재하지 않는다"면 id (c)를 비교하기 위해 자극하고, 그것을 id ('o')와도 비교하지 않을 것입니다. 사실,''c ''가 아닌 것 같다 ''는 파이썬 2.7에서''id (c)! = id ('o')''로 평가된다. – eyquem

답변

19

is 테스트하지만, 개체 값 평등에 대한 == 시험 :

In [1]: a = 3424 
In [2]: b = 3424 

In [3]: a is b 
Out[3]: False 

In [4]: a == b 
Out[4]: True 
+2

op의 문자열에 사용 된 이유가 파이썬 메소드의 아티팩트 변수에 문자열을 할당하는 것. 문자열은 불변이므로 전역 네임 스페이스에서 동일한 문자열을 포함하는 두 개의 변수가 동일한 객체를 참조합니다. – Wilduck

+0

어떤 종류의 파이썬을 사용합니까? 파이썬 2.7에서는''a is b'' 명령에 대해 True를 얻습니다! – eyquem

+0

이것은 Python 2.6.4를 사용하고 있습니다. 구현은 특정 객체를 캐시하도록 선택할 수 있습니다. 내 시스템에서 'a'는 'is'테스트를 통과하지만 '사과 소스'는 그렇지 않습니다. – tkerwin

5

is not이 참조를 비교합니다. ==은 값을 비교합니다

+0

'a == 123 '을 설정 한 후에'a == 123'이 true를 반환하는 이유는 무엇입니까? – ajwood

+1

@ajwood : 그 (것)들은 동일한 가치가 있기 때문에. '=='는 값을 비교합니다. – Wilduck

+1

더 나은 질문은 대부분의 구현에서 "a is 123"이 True를 반환하는 이유입니다. (http://stackoverflow.com/questions/306313/python-is-operator-behaves-nexpectedly-with-integers를 참조하십시오.) – geoffspear

1

혼란 스러움에 따라 도움이 될 수 있습니다.

이 명령문은 동일합니다 :

[c for c in s if c != 'o'] 
[c for c in s if not c == 'o'] 
0

난 그냥 아마 같은 객체를 참조 피연산자 하나와 동일하다 is 테스트 여부, 참조 인용하고있다. 여기서는 != 값을 테스트합니다.

s = [1,2,3] 
while s is not []: 
    s.pop(0); 

개체가 []의 개체 참조와 같지 않으므로이 개체는 완전히 다른 개체를 나타냅니다. 여기에서 s != []으로 조건을 바꾸면 루프를 명확하게 만들 것입니다. 왜냐하면 여기에서 값을 비교하기 때문에 s의 모든 값이 남아 있으면 빈 목록이 남습니다.

-1

나는 그들이 똑같은 일을하지 않는다고 덧붙이고 싶습니다. 나는! =을 사용할 것이다. 당신은 유니 코드 문자열이있는 경우 예를 들어 .... 아니다으로,이 경우 일치하는 반면 =가, 파이썬은 기본적으로 유니 코드에 STR에서 암시 적 변환을()()을 수행하고이를 비교!와

a = u'hello' 
'hello' is not a 
True 
'hello' != a 
False 

그것은 정확히 동일한 인스턴스입니다.

관련 문제