list append () 메서드가 새 목록을 반환하도록 허용하는 방법


82

다음과 같이하고 싶습니다.

myList = [10,20,30]
yourList = myList.append (40)

불행히도 목록 추가는 수정 된 목록을 반환하지 않습니다.

그렇다면 append새 목록을 반환하려면 어떻게해야합니까?

답변:


139

추가 대신 연결을 사용하지 마십시오.

yourList = myList + [40]

그러면 목록 이 반환 됩니다. myList영향을받지 않습니다. 당신이해야하는 경우 myList영향 뿐만 아니라 하나를 사용 .append()어쨌든, 다음 할당 yourList(사본)과는 별도로 myList.


2
동일한 목록 대신 append()반환 하는 이유는 무엇 이었을까요 None? 어떤 선 원칙을 위반할까요?
Ciprian Tomoiagă

3
@CiprianTomoiaga : en.wikipedia.org/wiki/Command%E2%80%93query_separation 참조 ; list.append쿼리가 아니라 명령입니다.
Martijn Pieters

2
@CiprianTomoiaga : Python BDFL 에서 보낸이 이메일 도 참조 하세요 .
Martijn Pieters

2
@Dieblitzen : 맞습니다. 그래서 OCaml은 연결 목록을 사용하여 연결합니다. 파이썬 목록은 불변이 아니므로 이것으로 그렇게 할 수 없으며, 그 밖의 모든 것은 변경 가능할 수 있습니다 . OCaml 목록에는 불변 객체가 포함되어 있지만 Python에서는 튜플과 같은 불변 객체의 내용은 여전히 ​​변경 가능하므로 연결할 때 다른 컨테이너와 내용을 공유 할 수 없습니다.
Martijn Pieters

2
@Dieblitzen : 그렇기 때문에 Python에서 연결 작업이 유효하려면 얕은 복사본을 만들고 O (N) 시간을 지불해야합니다. 좀 더 분명 했어야했는데 미안 해요
Martijn Pieters

21

파이썬 3에서는 이전 목록을 풀고 새 요소를 추가하여 새 목록을 만들 수 있습니다.

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

당신이 할 때 :

myList + [40]

실제로 3 개의 목록이 있습니다.


1
그리고 조금 더 빠른
aerobiomat

6

list.append내장되어 있으므로 변경할 수 없습니다. 그러나 이외의 다른 것을 사용하려는 경우 다음을 append시도해 볼 수 있습니다 +.

In [106]: myList = [10,20,30]

In [107]: yourList = myList + [40]

In [108]: print myList
[10, 20, 30]

In [109]: print yourList
[10, 20, 30, 40]

물론 이것의 단점은 새로운 목록이 생성된다는 것입니다. append

도움이 되었기를 바랍니다


그러나 내장는 서브 클래스화할 수 후 아무것도 :) 간다
마르신 Wyszynski에게

@MarcinWyszynski : 예,하지만 하위 클래스 내에서만 수정할 수 있습니다. 내장 객체 / 클래스의 내장 메소드는 거의 덮어 쓸 수 없습니다.
inspectorG4dget

3
자신의 정신 및 동료의 당신은 이제까지 그 :)하지 않을 것을
마르신 Wyszynski

2

내장 목록 유형을 하위 클래스로 만들고 'append'메소드를 재정의 할 수 있습니다. 또는 더 나은 방법은 원하는 작업을 수행 할 새 파일을 만드는 것입니다. 다음은 재정의 된 '추가'메서드에 대한 코드입니다.

#!/usr/bin/env python

class MyList(list):

  def append(self, element):
    return MyList(self + [element])


def main():
  l = MyList()
  l1 = l.append(1)
  l2 = l1.append(2)
  l3 = l2.append(3)
  print "Original list: %s, type %s" % (l, l.__class__.__name__)
  print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
  print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
  print "List 3: %s, type %s" % (l3, l3.__class__.__name__)


if __name__ == '__main__':
  main()

도움이되기를 바랍니다.


2

을 사용해보십시오 itertools.chain(myList, [40]). 새 목록을 할당하는 대신 생성기를 시퀀스로 반환합니다. 본질적으로 첫 번째 iterable에서 소진 될 때까지 모든 요소를 ​​반환 한 다음 모든 iterable이 소진 될 때까지 다음 iterable로 진행합니다.


1

Storstamp의 답변을 확장하려면

myList.append (40) 만하면됩니다.

원래 목록에 추가됩니다. 이제 원래 목록을 포함하는 변수를 반환 할 수 있습니다.

매우 큰 목록으로 작업하는 경우 이것이 갈 길입니다.


-4

myList.append (40) 만하면됩니다.

새 목록을 반환하지 않고 원래 목록에 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.