2014-02-26 5 views
1

두 변수가 다른 객체를 참조하는지 확인하고 싶습니다. 나는 파이썬에서 문자열이 객체라는 것을 알고있다. (나는 지금 파이썬을 배우는 자바 프로그래머이다.) ==이 값을 확인하는 동안 is이 참조를 확인했지만 다음 코드를 실행했을 때 값이 확인 된 것처럼 보였습니다.References 파이썬에서의 문자열 비교

name1 = "ABC D" 
name2 = "ABC D" 

if name1 is name2: 
    print "Equal!!!" 
else: 
    print "NOT equal!!!" 

동일 함!

+0

아마도 문자열 리터럴은 다른 방식으로 처리됩니다. 두 개의 객체로 시도하십시오 ... –

+1

문자열은 파이썬에서 불변하므로 재사용 할 수 없습니다. – Matthias

+0

또한 파이썬에서 문자열 풀링에 대해 참조하십시오 : http://stackoverflow.com/questions/2519580/are-strings-pooled-in-python – pajton

답변

2

Matthias의 의견에서와 마찬가지로 name1 = "ABC D"은 name1에 개체 "ABC D"의 참조를 할당하고 있습니다. 의심, 당신이 실제로 ID로 기본 개체를 검사 할 수있는 경우 파이썬이 같은 방식으로 작동하는 경우

() "당신이 (여기서 :

name1 = "ABC D" 
name2 = "ABC D" 
name3 = "Different string" 
print id(name1) 
print id(name2) 
print id(name3) 
+0

그렇다면 두 문자열을 참조하는 두 변수가 다른지 확인하는 방법은 무엇입니까? name1과 name2가 정말로 다르지만 같은 문자열 값을 원한다고 가정하십시오. –

+1

@AlexTwain 왜 그렇게하고 싶습니까? – thefourtheye

4

파이썬 인터프리터 것이다 인턴 작은 문자열 리터럴을 생각하는 확인 작은 "은 구현에 따라 다름). 이것은 name1 is name2True 인 이유입니다.이 두 이름은 같은 문자열 객체를 참조합니다.

CPython과 다른 구현체도 런타임 표현식의 결과를 포함하지 않으므로 실제로 문자열이 다른 객체가 필요한 경우 동적으로 작성할 수 있습니다. 예를 들어 : 방금 무슨 일이 일어날 지보고 실험을하고 있지만 이미 돌보는 문자열이 런타임 표현에서 오는 경우 한편

In [1]: prefix = 'ABC ' 

In [2]: a = prefix + 'D' 

In [3]: b = prefix + 'D' 

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

, 당신은 특별한 아무것도 할 필요가 없습니다.

어쨌든, 인턴 문자열은 구현 세부 사항입니다. 사용 사례에 따라 개체의 ID가 항상 다른지 확인해야하는 경우 사용자 지정 클래스를 사용해야합니다. 예를 들어 :

class Marker(str): 
    __slots__ =() 

이것은 아마도 예상대로 작동합니다

In [6]: Marker('ABC D') 
Out[6]: 'ABC D' 

In [7]: Marker('ABC D') is Marker('ABC D') 
Out[7]: False 

In [8]: Marker('ABC D') == Marker('ABC D') 
Out[8]: True 

당신이 사전의 키로서 개체를 사용할 계획하고 별개의 객체가 개별의 키가 될 것으로 기대하지 않는. 그러나이 경우 일반 문자열은 작동하지 않습니다.