[PYTHON] 파이썬 목록 추가 동작 [duplicate]
PYTHON파이썬 목록 추가 동작 [duplicate]
질문을 공식화하는 법을 정말로 모르는 ...
다음을 수행한다고 가정 해보십시오.
>>> l = [[]]*2
>>> l
[[], []]
>>> l[0].append(1)
>>> l
[[1], [1]]
왜 1이 두 목록에 추가됩니까?
해결법
-
==============================
1.[[]] * 2는 같은 목록에 대한 두 개의 참조 목록입니다. 추가 중이며 두 번 보게됩니다.
[[]] * 2는 같은 목록에 대한 두 개의 참조 목록입니다. 추가 중이며 두 번 보게됩니다.
-
==============================
2.실제로는 하나의 목록 만 있기 때문입니다. 이걸 고려하세요:
실제로는 하나의 목록 만 있기 때문입니다. 이걸 고려하세요:
>>> l = [[]] >>> l2 = l*2 >>> l2[0] is l[0] True >>> l2[1] is l[0] True
* 2는 목록에서 수행되지만 목록을 복사하지는 않지만 동일한 참조로 채워진 길이 2의 목록을 반환합니다.
당신이 원했던 것은 이것이었습니다 :
>>> l = [[] for _ in xrange(2)]
@Asterisk가 주석에서 언급했듯이 모든 공통 컬렉션에서 동일한 동작이 나타납니다. 경험적으로 말하면, 불변 형에 대한 값 승산 만 곱셈을 사용하는 것이 가장 좋습니다.
-
==============================
3.다음은 목록 목록을 초기화하는 방법입니다. 행은 가장 느리게 변합니다.
다음은 목록 목록을 초기화하는 방법입니다. 행은 가장 느리게 변합니다.
nrows = 3; ncols = 5 l_of_ls = [[0]*ncols for i in range(nrows )] for rix, r in enumerate(l_of_ls): for cix, c in enumerate(r): print rix, cix, 'val = ',c
결과
0 0 val = 0 0 1 val = 0 0 2 val = 0 0 3 val = 0 0 4 val = 0 1 0 val = 0 1 1 val = 0 1 2 val = 0 1 3 val = 0 1 4 val = 0 2 0 val = 0 2 1 val = 0 2 2 val = 0 2 3 val = 0 2 4 val = 0
또한 인덱싱 목적으로 주목할만한 가치가 있습니다.
for rix in range(nrows): for cix in range(ncols): print l_of_ls[rix][cix], print
결과
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-
==============================
4.메모리 레이아웃의 차이점 보여주기 :
메모리 레이아웃의 차이점 보여주기 :
listOfLists = [[]] * 3 listOfListsRange = [[] for i in range(0, 3)]
from https://stackoverflow.com/questions/7255383/python-list-append-behavior by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 : 유효하지 않은 토큰 (0) | 2018.10.05 |
---|---|
[PYTHON] 파이썬 목록 혼란 (0) | 2018.10.05 |
[PYTHON] 쿼리에 테이블 이름을 삽입하면 sqlite3.OperationalError : near "?": 구문 오류가 발생합니다. (0) | 2018.10.05 |
[PYTHON] 파이 게임 버튼 한 번 클릭 (0) | 2018.10.05 |
[PYTHON] 플라스크에 업로드 저장은 프로젝트 루트에만 저장됩니다. (0) | 2018.10.05 |