is 연산자는 주소값을 기반으로 값을 비교한다. ==는 순수하게 값이 같은지 비교하는데 반해,
is는 주소값을 기반으로 값이 같은지 비교한다.
ex)
a = b = 10
print a is b
그런데 이상한 예제가 하나 있다. 아래를 보자.
a = int(str(5))
b = 5
print a is b
단순히 숫자 5를 str로 변환했다가 다시 int함수로 정수로 만들었다. 이건 True가 출력될것이다. 그리고 또다시 아래 예제를 실행해보자.
a = int(str(500))
b = 500
print a is b
??? 숫자가 500으로 바뀌었을뿐인데 False가 출력된다. 왜그럴까?? 아래 링크에 답이 나와있다.
http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python
-5~256사이의 수는 파이썬 캐시에서의 숫자 표현 퍼포먼스때문에 조금 다르게 표현한다고 한다. (It turns out the reference implementation of Python caches integer objects in the range -5..256 as singleton instances for performance reasons.)
for i in range(-6, 258):
a = i
print "%i: %s" % (i, a is int(str(i)));
를 실행시켜보면 -6과 257만이 False가 나오고 나머지는 다 True가 나옴을 알 수 있다.
신기하다.
또 찾은게.. 예를들어 '\x1\x2'라는 문자열이 있다고 하자. s = '\x1\x2' 나는 \x를 %로 변경시키고 싶다. 그러면 일반적으로 s=s.replace('\\x','%') 처럼 할것이다. 그런데 안된다. '\x16진수 숫자' 는 자동으로 chr(숫자)로 콘솔에서 인식한다. print '\x61'을 출력해보면 a가 출력됨으로서 알 수 있다. 그러면 \x를 %로 변경시키려면 \x를 \x라는 문자열 자체로 인식하게 해야한다. 이건 앞에 r을 씀으로서 해결할 수 있다. r은 \n같은 문자열들을 \n자체로 인식하게한다.
print r'\x1\x2'.replace(r'\x','%')
를 출력해보면 %1%2가 나옴으로서 의도한대로 나왔다고 볼 수 있다. ''로 감싸져있는 문자열에는 r을 붙이면 된다지만.. 만약 어떤 함수의 결과값이 \x로 나온다고 해보자.
s = 어떤 함수()
그러면 이 경우에 s의 \x값을 변경하려면 어떻게 할까?? ''가 없어서 r도 못쓴다. 이 경우에 쓰는 함수가 repr이다. repr()은 내부의 \x이나 \n을 문자 그대로 인식하게 해준다. 원래 \n은 개행이지만 repr('\n')은 \n라는 문자 그대로 보여준다.
s = '\n'
print s
print repr(s)
를 출력해보면 알 수 있다. \x가 시스템해킹이던 웹해킹이던 자주 보는 문자열이기에 내가 처음에 난감했던것처럼 \x라는 문자열 자체로 인식하려면 뭔가 복잡했다. repr()을 쓰면 된다.
http://bytes.com/topic/python/answers/670554-how-print-raw-string-data-variable
'Python > 2.7 information' 카테고리의 다른 글
selenium (0) | 2015.08.09 |
---|---|
python .doc to .pdf, .xls to .pdf (0) | 2015.08.03 |
(나중 참고용) 캡쳐 프로그램, 후킹모듈 기본 (0) | 2015.06.06 |
python websocket 기초 참고용.(그냥 소켓 아님.) (0) | 2015.04.26 |
파이썬다운(?) 코드. (0) | 2015.04.22 |