
두둥. 위 코드에는 무슨 일이 있는걸까?
import os
r = list(map(bytearray,(b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')
for c in r:
os.write(1,c+b'\n')
for i in range(10):
for j in range(10):
r[i][j] = 153 - r[i][j]
print('반전 후')
for c in r:
os.write(1,c+b'\n')
import os
import sys
r = list(map(bytearray, (b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')
sys.stdout.flush() # 버퍼 강제 비움
for c in r:
os.write(1, c + b'\n')
for i in range(10):
for j in range(10):
r[i][j] = 153 - r[i][j]
print('반전 후')
sys.stdout.flush() # 다시 버퍼 강제 비움
for c in r:
os.write(1, c + b'\n')
여기서 문제가 생기는 핵심 이유는 print 함수와 os.write 함수의 출력 방식이 다르기 때문입니다.
1. print vs os.write
print()함수- 버퍼링(buffering) 됩니다.
- 즉,
print()로 출력 요청을 하면 바로바로 출력되는 게 아니라, 어느 정도 모아뒀다가 한꺼번에 출력하기도 합니다. - (특히 표준 출력(stdout)이 터미널이 아니라 파일이나 파이프에 연결된 경우 더 뚜렷합니다.)
os.write(fd, bytes)함수- 버퍼를 거치지 않고 운영체제에 바로 출력 요청을 합니다.
- 즉시 바로 출력됩니다.
2. 코드에서 무슨 일이 일어나는가?
print('원래상태')
👉 이건 버퍼링됩니다. 출력이 바로 되지 않을 수도 있습니다.os.write(1, ...)
👉 이건 즉시 출력됩니다.- 그래서
os.write로 출력된 “WBBBBBBBBW” 라인들이print('원래상태')보다 먼저 보이거나 뒤섞일 수 있습니다.
(※ 특히 프로그램이 짧아서 버퍼를 다 비우지 않고 종료해버리면 print한 내용이 아예 늦게 나오기도 합니다.)
3. 해결 방법
print를 쓰기 전에 버퍼를 강제로 비우면 순서가 정상화됩니다.
sys.stdout.flush()를 사용하면 됩니다.
코드를 수정해보면:
import os
import sys
r = list(map(bytearray, (b'WBBBBBBBBW' for _ in range(10))))
print('원래상태')
sys.stdout.flush() # 버퍼 강제 비움
for c in r:
os.write(1, c + b'\n')
for i in range(10):
for j in range(10):
r[i][j] = 153 - r[i][j]
print('반전 후')
sys.stdout.flush() # 다시 버퍼 강제 비움
for c in r:
os.write(1, c + b'\n')
'Tech > Coding' 카테고리의 다른 글
| 3356번 (라디오 전송) (0) | 2025.05.03 |
|---|---|
| 29768-펠린드롬 이름 (0) | 2025.05.03 |
| 토글 코드 트릭 (0) | 2025.04.29 |
| 위상 정렬 (Topological Sort) (0) | 2025.04.19 |
| 파이썬 heapq.heapreplace 동작 원리 (0) | 2025.04.12 |