[python]and와 &의 차이(or와 |의 차이)

김은지·2022년 1월 1일
0

학습 내용 정리

목록 보기
19/25

스터디에서 python set자료형의 교집합을 구하는 방법을 설명하는 과정에서 'and'와 '&'를 함께 써도 되는지에 대한 질문을 받았다.

나는 지난 며칠간 'and'와 '&'가 같은 것이라고 생각했기 때문에 아마 그럴 것이라고 대답하고

#각 언어를 활용할 수 있는 개발자라고 가정하면
java = {"yoo", "kim", "eun"}
python = set(["yoo", "choi"])
print(java & python) #{'yoo'} 
print(java and python) #{'yoo', 'choi'}

위 코드를 각각 출력해 봤는데 결과는 다르게 나왔다.

그래서 왜 위 두 줄의 코드가 다른 결과를 보여줬는지에 대해 공부해보았다.

기본적으로 'and'는 boolean 형에 기반한 연산에 쓰이고, &는 integer를 기반한 연산에 쓰이는 차이가 있다고 한다. 또,

  1. &와 |는 기호에 여러가지 의미가 부여되어 있다. 예를 들어, True & False의 결과는 False 이고, 99 & 7 은 3(2진수 &연산), 위의 set에서는 unions(합집합)/intersection의 의미를 내포한다.

  2. and와 or는 짧은 계산을 한다. (&와 |는 그렇지 않음)

a = 3 
b = 5
c = 0

각각의 변수를 and로 연산할 경우 아래와 같은 결과가 출력된다.

print(a and b) #5
print(a and c) #0
print(c and a) #0

boolean형으로 결과를 출력하지 않는 이유는 피연산자(a, b, c)의 값으로 이미 결과가 True인지 False인지 알 수 있기 때문이다.

a and b 연산에서 a는 3으로 True이다. 따라서 이 연산의 결과는 b에 의해 결정된다.

그래서 파이썬에서는 끝까지 연산을 하지 않고 결과를 결정하는 피연산자인 b의 값을 출력하는 것이다.

그 다음 연산 역시 a는 True이기에 결과를 결정하는 c의 값을 출력한다.

마지막 연산에서는 c가 False이기 때문에 and 연산의 결과를 결정한다. 따라서 역시 c의 값을 출력한다.

or 연산의 경우도 마찬가지로 '결과에 영향을 미치는 피연산자'를 출력하고 종료된다.

if x is not None and x.foo == 42:
	#...

위의 코드는 stackoverflow에 있는 예시이다.

x가 None일 경우 위의 코드는 x.foo라는 피연산자를 검토하지 않는다. (연산자 and를 사용했기 때문에)

하지만 연산자를 &로 바꾸면 x.foo라는 속성이 존재하지 않기 때문에 에러가 발생하며 프로그램이 종료된다. 그 이유는 &는 결과에 상관 없이 끝까지 연산을 계속하기 때문이다.

그래서 'and' 연산자를 썼을 경우 java의 값이 'True'이기 때문에 python의 값을 출력하는 것이다.


참고 :
stack overflow : Boolean operators vs Bitwise operators

0개의 댓글