is
- identity 연산자
- reference comparison (참조 비교)
==
- 비교 연산자
- value comparison (값 비교)
위의 예시에서는 변수가 달라도 값이 같으면 is든 ==이든 모두 True가 나왔습니다.
이번엔 값을 다르게해보겠습니다.
이번에는 값이 같으니 ==는 True가 나왔지만 is는 False가 나왔습니다.
이유는 다음 이미지에서 확인할 수 있습니다.
id 메소드는 객체의 주소값은 아니고 주소값과 매칭되는 유니크한 int값을 반환합니다.
아까 값이 1이었던 두 변수는 주소값이 같은 걸 볼 수 있고,
값이 257이었던 두 변수는 주소값이 다른 걸 확인할 수 있습니다.
즉, is는 주소값을 비교하여 같으면 True, 다르면 False를 반환합니다.
파이썬의 메모리 주소 할당원리를 완벽히는 모르지만,
int로 따지면 -5~256 까지의 작은 숫자는 파이썬 내부적으로 캐시돼있어서
다른 변수에 같은 값을 넣어도 같은 메모리 주소를 참조합니다.
하지만 257이상의 숫자는 다른변수에 정의하면 값이 같아도 다른 주소에 할당됩니다.
String도 ‘teemo’같이 짧은건 같은 주소에 할당되지만,
‘teemo is the cutest champion in league of legends’와 같이 긴건 다른 주소에 할당됩니다.
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값을 반환합니다.
8 & 10 을 이진수로 표현하면 1000 & 1010 과 같은데 이 결과는 1000이 되므로 8이 반환됩니다.
그리고 0을 제외한 모든 숫자는 True이므로, 8 and 10 은 8이 True이고 10이 반환됩니다.
0 and 100과 100 and 0은 0이 False이므로 0이 반환됩니다.
>>> 4 and 7
7
>>> 4 & 7
4
>>> 7 & 4
4
>>> 1100 & 1011
64
>>> 12 & 11
8
>>> 12 and 11
11
& 연산은 비트연산이므로 2진법으로 변환 후 하나하나 비교해서 교집합을 반환한다.
>>> 0b1100 and 0b1011
11
>>> 0b1100 & 0b1011
8
2진법 숫자로 나타내고 싶을 땐 숫자 앞에 0b를 붙여서 쓰면 된다.
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값을 반환합니다.
8 or 10 은 8이 True이므로 8이 반환됩니다.
8 ⎪ 10 은 이진수로 표현하면 1000 ⎪ 1010 이고, 이 결과는 1010이 되므로 10이 반환됩니다.
0 or 100 과 100 or 0 은 0이 False고 100이 True이므로 100이 반환됩니다.
not
- 논리 연산자
- True, False 연산
~
- 비교 연산자
- bitwise 연산자
7은 True니까 not 7은 반대인 False가 나왔고
0은 False니까 not 0은 반대인 True가 나왔습니다.
~7은 이진수로 나타내면 ~0111 이고, ~는 0은 1, 1은 0이 되므로
1000이고 십진법으론 -8이 됩니다.(보수가 됩니다)
(이진법의 음수에 대한 설명은 여기에 있습니다)
마찬가지로 ~0은 0의 보수인 -1이 나오게 됩니다.
우선순위 | 연산자 | 설명 |
---|---|---|
1 | (값...), [값...], {키: 값...}, {값...} | 튜플, 리스트, 딕셔너리, 세트 생성 |
2 | x[인덱스],x[인덱스:인덱스],x(인수...), x.속성 | 리스트(튜플) 첨자, 슬라이싱, 함수 호출, 속성 참조 |
3 | await x | await 표현식 |
4 | ** | 거듭제곱 |
5 | +x, -x, ~x | 단항 덧셈(양의 부호), 단항 뺄셈(음의 부호), 비트 NOT |
6 | *, @, /, //, % | 곱셈, 행렬 곱셈, 나눗셈, 버림 나눗셈, 나머지 |
7 | +, - | 덧셈, 뺄셈 |
8 | <<, >> | 비트 시프트 |
9 | & | 비트 AND |
10 | ^ | 비트 XOR |
11 | \ | 비트 OR |
12 | in, not in, is, is not, <, <=, >, >=, !=, == | 포함 연산자, 객체 비교 연산자, 비교 연산자 |
13 | not x | 논리 NOT |
14 | and | 논리 AND |
15 | or | 논리 OR |
16 | if else | 조건부 표현식 |
17 | lambda | 람다 표현식 |