목록을 지우는 다른 방법


207

파이썬에서 목록을 지우고 싶을 때이 두 줄 중 하나보다 더 복잡한 것을 할 이유가 있습니까?

old_list = []
old_list = list()

내가 묻는 이유는 실행중인 코드에서 이것을 보았 기 때문입니다.

del old_list[ 0:len(old_list) ]

1
왜 이런 짓을하는? 가비지 콜렉션이 작동합니다. 왜 이전 목록 값을 무시하고 파이썬이 자동으로 정리하도록 하시겠습니까?
S.Lott

40
@ S.Lott : 포스터는 코드를 작성하지 않았으며, 원래 작가가 왜 그렇게했는지 묻습니다.
John Fouhy

1
당신은 또한 할 수 있습니다 : while l : l.pop ()
RoadieRich

12
LOL. 나는 그것이 효율적이라고 확신한다.
FogleBird

18
질문과 관련이 없지만 슬라이스를 지정할 때 len을 사용해서는 안됩니다. a[:x]x는 시작을 a[x:]의미하고 x는 끝을 의미합니다. a[ 0:len(a) ]로 쓸 수 있습니다 a[:]. 음수를 사용하여 끝에서 계산할 수도 있습니다 ( a[-1]마지막 요소 임).
idbrii

답변:


356

목록을 지우면 동일한 목록의 다른 모든 참조에 영향을줍니다.

예를 들어이 방법은 다른 참조에는 영향을 미치지 않습니다.

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

그러나 이것은 :

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

당신은 또한 할 수 있습니다 :

>>> a[:] = []

86
당신은 또한 할 수 있습니다del a[:]
idbrii

1
첫 번째 이유 만 영향을 미치는 이유는 무엇 a입니까? 나는 같은 대상을 생각 a하고 b언급했습니다. 이유를 알고 싶을뿐입니다. 감사.
Alston

37
파이썬 3.3 과 나중에는 함께 갈 수있다 a.clear(), 아무 문제!
Marek Lewandowski

4
@Stallman은 처음에 'a'에 대한 참조를 변경하여 하나를 지우지 않고 새 배열을 가리키고 b가 여전히 오래된 배열을 가리키고 있기 때문에
Pax0r

4
누군가가 그 방법들 사이의 성능 차이를 보여줄 수 있다면 좋을 것입니다!
Suanmeiguo

37

이렇게 alist = []목록을 삭제하지 않고, 단지 빈리스트를 만들어 변수에 바인드합니다 alist. 다른 변수 바인딩이있는 경우 이전 목록이 계속 존재합니다.

실제로 내부에서 목록 지우려면 다음 방법 중 하나를 사용할 수 있습니다.

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

자세한 내용은 Mutable Sequence Types 문서 페이지를 참조하십시오.


2
나는 테스트했고 alist * = 0이 가장 빠르며, 다음으로 가장 빠른 것이 alist.clear ()이고 다른 두 가지 방법도 똑같이 빠릅니다. alist * = 0이 가장 빠른 이유를 설명해 주시겠습니까?
Jenny

3
@Jenny : 후드 아래에서 더 적은 (또는 덜 비싼) opcode 를 사용합니다. 예를 들어, 운영자 버전은 메소드 이름을 찾거나 슬라이스를 빌드 할 필요가 없습니다.
Eugene Yarmash

"한 가지 분명한 방법이 있어야한다." 파이썬이 여기에 빛나고 있습니다 :)
Nik O'Lai

36

파이썬 목록을 지우는 매우 간단한 방법이 있습니다. del list_name [:]을 사용하십시오 .

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

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []

13

del은 당신에게 메모리를 되돌려 줄 것입니다. 새 목록을 할당하면 gc가 실행될 때만 이전 목록이 삭제됩니다.

큰 목록에는 유용 ​​할 수 있지만 작은 목록에는 무시해도됩니다.

편집 : 알고리즘으로는 중요하지 않습니다.

참고

del old_list[ 0:len(old_list) ]

에 해당

del old_list[:]

2
gc는 주기적으로 실행되지 않습니다. 마지막 참조가 삭제 되 자마자 목록이 해제됩니다.
Algorias

2
알고리즘 : CPython에게는 맞지만 다른 구현에는 적합하지 않을 수 있습니다.
mhsmith

2
델 old_list [0 : 렌 (old_list)] 및 델 old_list [:] 동일한 결과가 있지만, 후자 빠르게 (파이썬 2.6 체크)한다
로이 Nieterau

6
del list[:] 

해당 목록 변수의 값을 삭제합니다

del list

변수 자체를 메모리에서 삭제합니다


5

목록을 지우려는 경우가 두 가지 있습니다.

  1. old_list코드에서 이름을 더 사용하려고합니다 .
  2. 이전 목록을 가능한 빨리 가비지 수집하여 일부 메모리를 확보하려고합니다.

경우 1 당신은 단지 어설 션으로 진행합니다 :

    old_list = []    # or whatever you want it to be equal to

2의 경우, del명령문은 이름이 old list가리키는 목록 오브젝트에 대한 참조 계수를 줄 입니다. 목록 개체가 이름 만 가리키는 old_list경우 참조 횟수는 0이되고 가비지 수집을 위해 개체가 해제됩니다.

    del old_list

3

목록을 지우고 있다면 더 이상 목록이 필요하지 않습니다. 그렇다면 간단한 방법으로 전체 목록을 삭제할 수 있습니다.

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

그러나 다시 필요한 경우 다시 초기화 할 수 있습니다. 또는 단순히

del a[:]

-4

잘 작동하는 다른 솔루션은 빈 목록을 참조 빈 목록으로 만드는 것입니다.

empt_list = []

예를 들어으로 목록이 있습니다 a_list = [1,2,3]. 지우려면 다음을 수행하십시오.

a_list = list(empt_list)

이렇게하면 a_list처럼 빈 목록 이 만들어 empt_list집니다.


empt_list를 만들 이유가 없습니다. a_list = list ()를 사용하십시오.
Daniel Harding
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.