목록을 비우는 방법?


356

이 방법으로 목록을 비우는 것은 "더러운"것 같습니다.

while len(alist) > 0 : alist.pop()

그렇게하는 명확한 방법이 있습니까?


28
그렇다면 파이썬 dicts와 set에는 왜 clear () 메소드가 있지만 목록은 없습니까?
Job

13
그러나 객체에 대한 참조가 여러 개인 경우 유용 할 수 있습니다.
Ned Deily

3
런타임에 프로세스를 통해 공유 목록을 지우고 Garbaging을 기다릴 필요가없는 경우 (또는 잘못 되었습니까? 가비지 콜렉션을 오해 했습니까?) 유용 할 수 있습니다. 또한 팝업 된 각 요소를 확인하려면 슬라이싱을 사용할 수없는 동안 디버깅 할 수 있습니다 (또는 잘못되었습니다). 내 목록을 지우는 동안 프로세스 실행을 중지 할 필요가 없습니다.
DrFalk3n

2
@ S.Lott 왜 이것이 중요한지 이해하지 못한다고해서 다른 사람들이 그렇지 않다는 것을 의미하지는 않습니다. 여러 객체가 공통 목록에 의존하는 경우 중요합니다. 여러 디자인 패턴에서 이것이 중요합니다. 가비지 콜렉터는 스스로 청소할 필요가 없다는 것을 의미합니다. 더 엉망으로 만드는 것은 라이센스가 아닙니다.
UpAndAdam

4
다른 더 나은 답변에도 불구하고 초기 코드를 작성할 수 있습니다. while alist : alist.pop ()
MrWonderful

답변:


570

이것은 실제로 목록에서 내용을 제거하지만 이전 레이블을 새로운 빈 목록으로 대체하지 않습니다.

del lst[:]

예를 들면 다음과 같습니다.

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

완전성을 위해 슬라이스 할당은 동일한 효과를 갖습니다.

lst[:] = []

또한 부품을 동시에 교체하면서 목록의 일부를 축소하는 데 사용할 수도 있습니다 (그러나 문제의 범위를 벗어남).

그렇게 lst = []하면리스트를 비우지 않고 새 객체를 만들어 변수에 바인딩 할 수 lst있지만, 기존리스트에는 여전히 동일한 요소가 있으며 다른 변수 바인딩이 있으면 효과가 분명해집니다.


3
두 가지 질문이 더 있습니다 : "del"이란 무엇입니까? (나는 그것을 혐오하는 것으로 추론하지만 그것이 무엇인지 정말로 모른다.) 그리고 2 차 : 당신은 어떻게 읽는가 (소리내어) [:]
OscarRyz

2
del에 대한 올바른 설명은 다음 문서를 참조하십시오. docs.python.org/reference/simple_stmts.html#the-del-statement
fortran

14
나는 보통 큰 파이썬 코드 xD를 읽지 않지만, 내가해야한다면 "목록 l의 처음부터 끝까지 슬라이스"라고 말할 것입니다.
포트란

2
@jellybean 완전히 의도하지 않은 ^ _ ^ 영어는 모국어가 아니므로 두 의견의 대조를 실제로 알지 못했습니다.
포트란

만약 우리가 l = []하면 파이썬 GC에 의해 오래된리스트 내용이 가비지 수집되지 않습니까?
Alex Punnen

168

파이썬 3.3 이상을 실행하는 경우, 당신은 사용할 수있는 clear()방법 list에 평행, clear()dict, set, deque및 기타 변경 가능한 컨테이너 유형을 :

alist.clear()  # removes all items from alist (equivalent to del alist[:])

링크 된 문서 페이지에 따라을 사용하여 동일한 내용을 얻을 수도 있습니다 alist *= 0.

요약하면, 목록을 제자리에서 지우는 동등한 방법이 4 가지 있습니다 ( PythonZen과 반대로 )!

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0

6
이 답변은 맨 위에 있어야합니다.
BreakBadSP

clear ()가 좋습니다.
sailfish009

61

시도해 볼 수 있습니다 :

alist[:] = []

의미 : 목록에서 목록의 []요소 (0 개 요소) [:](시작부터 끝까지의 모든 색인)

[:]는 슬라이스 연산자입니다. 자세한 내용은 이 질문 을 참조하십시오.


4
왜 안돼 alist = []?
mitenka

16
목록을 비우지 않는 @mitenka는 변수 alist가 비어있는 다른 목록으로 덮어 씁니다 . 다른 사람이 (로 시작하는 거기에 있었다 어떤 즉 포함 된) 그대로 남아있는 원본 목록에 대한 참조가 있다면
아담 Batkin을

@mitenka 또 다른 이유는 이것이 사실 alist.clear()인지 alist[:] = []확인하는 데 도움 alist이됩니다. alist함수에서 돌아 왔다고 가정 해보십시오 foo(). foo목록을 반환 했다고 생각 했지만 실제로는을 반환했습니다 None. 사용 alist = []은 그 실수를 잡을 수 없습니다.
aafulei

32

파이썬 2.5.2에서는 1.1 usec del l[:]보다 약간 느립니다 l[:] = [].

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2

1
Python 2.7.2에서는 내 컴퓨터에서 거의 동일합니다. 둘 다 루프 당 13.5-13.7 usec에서 실행됩니다.
leetNightshade

또한 python3-mtimeit "l = list (range (1000))" "b = l [:]"를 측정하여 "b [:] = []"및 "del b [:]"를 계산해야합니다. 그것을하고 lol ...
rockdaboot

1
나는 파이썬 3.5로 벤치 마크를했고 leetNightshade에 동의합니다. .clear(), del b[:]b[:]=[]같은 모든 실행은 ( b[:]=[]약간 느린 것.
Conchylicultor

5
lst *= 0

같은 효과가 있습니다

lst[:] = []

조금 더 간단하고 기억하기 쉽습니다. 그 외에는 할 말이 많지 않습니다

효율성은 거의 같습니다


1
완성도를 높이기 위해 주어진 정수보다 작거나 같은 정수 0는 동일한 효과를 나타냅니다. 나는 조금 슬프다하지만 그것은 많은 관심을받지 않았다고, 꽤 깔끔한 트릭 ...
피터 VARO

-1
list = []

list빈 목록으로 재설정 됩니다.

일반적으로 list리스트 객체의 생성자 인 예약 된 함수 이름을 숨겨서는 안됩니다 . 예를 들어 대신 사용 lst하거나 list_대신 사용할 수 있습니다 .


38
아니요 : 목록을 수정하지 않고 빈 목록을 변수에 할당합니다 list. 예를 들어 전달 된 목록을 수정하는 함수가 필요한 경우 원하는 작업을 수행하지 않습니다.
Adam Batkin

10
실제로는 아닙니다. 문제는 "목록을 비우는 방법"이 아니라 "목록을 포함하는 변수를 할당하는 방법"
Adam Batkin

6
문제는 모호하지 않았고 op의 스 니펫은 목록에서 요소를 튀어 나왔습니다 (즉, 수정).
fortran

7
또한 "list"유형은 그림자이므로 "list"를 변수 이름으로 사용해서는 안됩니다. 많은 Python 개발자는 "L"을 목록 변수 이름으로 사용하지만 "lst"를 선호합니다.
steveha

1
때로는 목록을 비우기를 원하며 제안 된 방법만큼 좋습니다. 아마 더 빠름
smac89

-3

상황에 따라 사용할 수있는 또 다른 간단한 코드는 다음과 같습니다.

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

목록의 길이에서 색인을 시작하고 0에서 색인으로 이동해야합니다. 목록의 길이와 같은 색인으로 반으로 줄어 듭니다.

또한 while 행에 "보다 크거나 같은"부호가 있는지 확인하십시오. 생략하면 list [0]이 (가) 남게됩니다.


15
큐브와 바퀴를 재발견
CONvid19

ㅋ. 이것은 내가 SO에서 만난 두 번째 이상한 답변 (+ 적절한 주석)입니다. D :이 기억에 남는 것들에 대한 사이트가 있어야합니다
akinuri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.