[python] identity / bitwise operator


is와 ==

is

  • identity 연산자
  • reference comparison (참조 비교)

    ==

  • 비교 연산자
  • value comparison (값 비교)

예시를 알아보겠습니다. 1.is_comparison_1

위의 예시에서는 변수가 달라도 값이 같으면 is든 ==이든 모두 True가 나왔습니다.


이번엔 값을 다르게해보겠습니다. 2.is_comparison_2

이번에는 값이 같으니 ==는 True가 나왔지만 is는 False가 나왔습니다.

이유는 다음 이미지에서 확인할 수 있습니다.

3.id

id 메소드는 객체의 주소값은 아니고 주소값과 매칭되는 유니크한 int값을 반환합니다.

아까 값이 1이었던 두 변수는 주소값이 같은 걸 볼 수 있고,

값이 257이었던 두 변수는 주소값이 다른 걸 확인할 수 있습니다.

즉, is는 주소값을 비교하여 같으면 True, 다르면 False를 반환합니다.


파이썬의 메모리 주소 할당원리를 완벽히는 모르지만,

int로 따지면 -5~256 까지의 작은 숫자는 파이썬 내부적으로 캐시돼있어서

다른 변수에 같은 값을 넣어도 같은 메모리 주소를 참조합니다.

하지만 257이상의 숫자는 다른변수에 정의하면 값이 같아도 다른 주소에 할당됩니다.

String도 ‘teemo’같이 짧은건 같은 주소에 할당되지만,

‘teemo is the cutest champion in league of legends’와 같이 긴건 다른 주소에 할당됩니다.


is not은 말그대로 is의 반대값을 리턴합니다.

4.is_not


and와 &

and

  • 논리 연산자
  • True, False 연산

    &

  • 비교 연산자
  • bitwise 연산자

docs에 나온 and 연산자의 설명입니다.

The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.

즉, x and y 가 있으면 x가 False면 x를 반환하고, x가 True면 y값을 반환합니다.

5.and

8 & 10 을 이진수로 표현하면 1000 & 1010 과 같은데 이 결과는 1000이 되므로 8이 반환됩니다.

그리고 0을 제외한 모든 숫자는 True이므로, 8 and 10 은 8이 True이고 10이 반환됩니다.

0 and 100과 100 and 0은 0이 False이므로 0이 반환됩니다.


or과 |

or

  • 논리 연산자
  • True, False 연산

    |

  • 비교 연산자
  • bitwise 연산자

docs에 나온 or 연산자의 설명입니다.

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

즉, x or y 가 있으면 x가 True면 x가 반환되고, x가 False면 y값을 반환합니다.

6.or

8 or 10 은 8이 True이므로 8이 반환됩니다.

8 ⎪ 10 은 이진수로 표현하면 1000 ⎪ 1010 이고, 이 결과는 1010이 되므로 10이 반환됩니다.

0 or 100 과 100 or 0 은 0이 False고 100이 True이므로 100이 반환됩니다.


not과 ~

not

  • 논리 연산자
  • True, False 연산

    ~

  • 비교 연산자
  • bitwise 연산자

7.not

7은 True니까 not 7은 반대인 False가 나왔고

0은 False니까 not 0은 반대인 True가 나왔습니다.

~7은 이진수로 나타내면 ~0111 이고, ~는 0은 1, 1은 0이 되므로

1000이고 십진법으론 -8이 됩니다.(보수가 됩니다)

(이진법의 음수에 대한 설명은 여기에 있습니다)

마찬가지로 ~0은 0의 보수인 -1이 나오게 됩니다.



덧붙이는 말

분명 터미널에서 위의 사항을 다 확인했는데

파이참에서 하니까 했던대로 안된다…;;

분명 257이상에서는 is 하면 주소값이 달려져야 하는데…

8.pycharm

마지막에 세번째 예제처럼 +1, +’s’ 와 같이 정의하면

의도했던대로 나온다.

pycharm에서의 이 현상은 아직 원인 파악을 못했다..