복붙노트

[PYTHON] 파이썬 목록 추가 동작 [duplicate]

PYTHON

파이썬 목록 추가 동작 [duplicate]

질문을 공식화하는 법을 정말로 모르는 ...

다음을 수행한다고 가정 해보십시오.

    >>> l = [[]]*2
    >>> l
    [[], []]
    >>> l[0].append(1)
    >>> l
    [[1], [1]]

왜 1이 두 목록에 추가됩니까?

해결법

  1. ==============================

    1.[[]] * 2는 같은 목록에 대한 두 개의 참조 목록입니다. 추가 중이며 두 번 보게됩니다.

    [[]] * 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. ==============================

    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. ==============================

    4.메모리 레이아웃의 차이점 보여주기 :

    메모리 레이아웃의 차이점 보여주기 :

    listOfLists = [[]] * 3
    listOfListsRange = [[] for i in range(0, 3)]
    

  5. from https://stackoverflow.com/questions/7255383/python-list-append-behavior by cc-by-sa and MIT license