[파이썬] 초보자 3줄짜리 코드 질문드립니다! (list.append(input)무한입력현상 발견..)

조회수 1691회

안녕하세요

파이썬 공부 시작한지 얼마안된 학생입니다.

제가 할려는 건 단어를 입력 받아 처리하는거 였습니다.

그러던 중 우연히 아래와 같은 현상이 나왔는데

이해가 안되서 질문드립니다.

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

입력이

계속

됩니다..

  1. 왜 그런걸까요?
  2. 파이썬 동작을 내부적으로 이해할수 있는 좋은 방법이나 자세히 서술된 책 혹시 아시면 추천좀 해주시면 감사감사하겠습니다. (꾸벅)

[수정]

[wl.append('hello') for t in range(len(wl))]

마지막줄을 저렇게 변경하니깐 제대로 작동됩니다. 하지만 둘의 차이와 명확한이유를 모르겠습니다..

[수정]

캡쳐화면 추가했습니다; 이미지

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    질문자가 오해를 하는겁니다.

    무한입력 반복이 되는게 아니라...[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]
    
    • 감사감사합니다. 진짜 답답했는데 시원하게 해결됐네요 .. 그냥 커서깜박이는 거였군요 ; 최진우 2017.8.26 21:49
  • [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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)