파이썬3 리스트 생성 질문입니다


txt1 = [[],[],[],[],[],[],[],[],[],[]]
txt2 = [[]]*10

txt1과 txt2의 동작이 같지 않은데 왜인가요?

  • 2017년 08월 12일에 작성됨

조회수 71


2 답변


좋아요
0
싫어요
채택취소하기

array 모듈을 이용해서 배열을 만들수도 있고 아래와 같이 list comprehension 을 사용하는 방법도 있습니다.(결국 루프로 만드는 것 입니다.)

>>> someList = [[] for x in range(10)]
>>> someList[0].append(1)
>>> someList
[[1], [], [], [], [], [], [], [], [], []]
  • 2017년 08월 14일에 작성됨


txt2 의 경우 레퍼런스만 복사가 되었기 때문입니다. 즉 c/c++ 언어를 안다면 같은 포인터만 10개를 복사한겁니다.

복사한 것들중 한곳에 대입을 할경우 포인터의 역참조 값은 다 같게 됩니다.(같은 곳을 가리킴)

txt1 = [[],[],[],[],[],[],[],[],[],[]]
txt2 = [[]]*10


txt1[0].append('a')
txt1
Out[12]: [['a'], [], [], [], [], [], [], [], [], []]

txt2[0].append('a')
txt2
Out[10]: [['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a']]

txt2[3][0] = 'b'
txt2
Out[25]: [['b'], ['b'], ['b'], ['b'], ['b'], ['b'], ['b'], ['b'], ['b'], ['b']]
  • 2017년 08월 13일에 작성됨

  • 그럼 저런 빈 리스트 안의 리스트를 txt1처럼 개별적으로 많이 만들고 싶으면 어떻게 해야 하나요? 루프를 돌려서 txt2.append([]) 시키는 수밖에 없나요?    Junho Lee   2017.8.13 15:35     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close