[파이썬] 초보자 3줄짜리 코드 질문드립니다! (list.append(input)무한입력현상 발견..)
조회수 1706회
안녕하세요
파이썬 공부 시작한지 얼마안된 학생입니다.
제가 할려는 건 단어를 입력 받아 처리하는거 였습니다.
그러던 중 우연히 아래와 같은 현상이 나왔는데
이해가 안되서 질문드립니다.
wl = []; nl = []
[wl.append(input()) for t in range(int(input()))]
[wl.append('hello') for t in wl]
첫번째는 입력받은 단어수를 입력 받고 한줄씩 단어를 입력 받습니다.
3
hello
hash
code
이런식으로 말이죠..
그리고 이 리스트단어수 만큼 뒤에 '헬로'를 붙이려하는데 뜬금없이 계속 입력을 받습니다.
3
hello
hash
code
입력이
계속
됩니다..
- 왜 그런걸까요?
- 파이썬 동작을 내부적으로 이해할수 있는 좋은 방법이나 자세히 서술된 책 혹시 아시면 추천좀 해주시면 감사감사하겠습니다. (꾸벅)
[수정]
[wl.append('hello') for t in range(len(wl))]
마지막줄을 저렇게 변경하니깐 제대로 작동됩니다. 하지만 둘의 차이와 명확한이유를 모르겠습니다..
[수정]
캡쳐화면 추가했습니다;
2 답변
-
질문자가 오해를 하는겁니다.
무한입력 반복이 되는게 아니라...[wl.append('hello') for t in wl] 코드가 수행되는데 걸리는 시간동안 커서가 깜박거리는거에요...질문자는 계속 입력이 받아진다고 생각하는것이구요.
프로그램 수행하고 메모리 상태를 보세요. 계속 증가할거에요...몇분 두면 메모리 오류나면서 프로세스가 종료될겁니다.
(py36) allinux@~$ python -V Python 3.6.2 (py36) allinux@~$ cat abcd.py wl = []; nl = [] [wl.append(input()) for t in range(int(input()))] #[wl.append('hello') for t in wl] (py36) allinux@~$ python abcd.py 3 aaa bbb ccc (py36) allinux@~$
테스트를 아래와 같이 수정하고 해보세요.
wl = []; nl = [] [wl.append(input('Input a string: ')) for t in range(int(input('Input a Number: ')))] [wl.append('hello') for t in wl]
-
[wl.append('hello') for t in wl]
for t in wl 은 wl에서 요소를 하나씩 받아오는 겁니다. 즉 요소가 3개면 요소 3개를 조회하게 됩니다. 그런데 반복시마다 다시 wl.append를 호출하여 wl에 요소를 추가하므로 결국 무한 반복입니다.
[wl.append('hello') for t in range(len(wl))]
len(wl) 에 의해 호출될 때 시점의 리스트 사이즈를 얻습니다. len(w) 는 단 한번만 호출되므로 wl.append 에 의해 영향을 받지 않습니다.
- 그렇다면 hello가 무한으로 추가되는거 아닌가요? 최진우 2017.8.25 21:24
- [wl.append(input()) for t in range(int(input()))] 최진우 2017.8.25 21:25
- 이게 무한반복이 되는데요.. 최진우 2017.8.25 21:25
- [wl.append(input()) for t in range(int(input()))] 이 코드는 무한반복 되지 않아요 첫 입력값에 3을 넣으면 3번 입력을 받아요. 정영훈 2017.8.26 04:10
- [wl.append('hello') for t in wl] 코드가 무한반복이 되는데...프로그래밍 입문자면 지금 시점에는 이해가 어려울 수 있어요.wl은 리스트이고 for 반복에 의해 index가 한칸씩 증가하면서 wl을 조회하는데 append에 의해 wl이 하나씩 계속 커져서 한칸 증가하고 하나 추가되는 행위를 무한반복하게 되는 거에요. 정영훈 2017.8.26 04:12
- 답장감사합니다. ㄷ 캡쳐화면 추가했는데 [wl.append(input()) for t in range(int(input()))] 이 코드가 반복되는것 같은데요.. 최진우 2017.8.26 15:25
댓글 입력