Python/2.7 information

is operator, raw string(r'', repr함수)

qkqhxla1 2015. 7. 20. 17:29

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