Разница между list = [] и list.clear () - PullRequest
2 голосов
/ 29 апреля 2019

В чем разница между list = [] и list.clear()?

Основываясь на поведении моего кода и моих собственных наблюдениях, list.clear() удаляет свои записи, а также записи, которые я использовал для добавления своих данных.

Пример:

container.append(list)
list.clear()

container также будет []

Ответы [ 2 ]

12 голосов
/ 29 апреля 2019

Вызов clear удаляет все элементы из списка. Назначение [] просто заменяет эту переменную другим пустым списком. Это становится очевидным, когда две переменные указывают на один и тот же список.

Рассмотрим следующий фрагмент:

>>> l1 = [1, 2, 3]
>>> l2 = l1
>>> l1.clear()
>>> l1 # l1 is obviously empty
[]
>>> l2 # But so is l2, since it's the same object
[]

По сравнению с этим:

>>> l1 = [1, 2, 3]
>>> l2 = l1
>>> l1 = []
>>> l1 # l1 is obviously empty
[]
>>> l2 # But l2 still points to the previous value, and is not affected
[1, 2, 3]
2 голосов
/ 29 апреля 2019

Вы также можете увидеть это, если взгляните на сгенерированный байт-код.Здесь часть с x = []

import dis

print("Exmaple with x = []")

s1 = """
x = [1,2,3]
x = []
"""

dis.dis(s1)

, которая выводит

Exmaple with x = []
  2           0 LOAD_CONST               0 (1)
              2 LOAD_CONST               1 (2)
              4 LOAD_CONST               2 (3)
              6 BUILD_LIST               3
              8 STORE_NAME               0 (x)

  3          10 BUILD_LIST               0
             12 STORE_NAME               0 (x)
             14 LOAD_CONST               3 (None)
             16 RETURN_VALUE

, мы можем видеть, что два списка построены, так как у нас есть два BUILD_LIST.Теперь, если мы посмотрим на x.clear()

print("Exmaple with x.clear()")

s2 = """
x = [1,2,3]
x.clear()
"""

dis.dis(s2)

, мы получим следующий вывод

Exmaple with x.clear()
  2           0 LOAD_CONST               0 (1)
              2 LOAD_CONST               1 (2)
              4 LOAD_CONST               2 (3)
              6 BUILD_LIST               3
              8 STORE_NAME               0 (x)

  3          10 LOAD_NAME                0 (x)
             12 LOAD_ATTR                1 (clear)
             14 CALL_FUNCTION            0
             16 POP_TOP
             18 LOAD_CONST               3 (None)
             20 RETURN_VALUE

, и здесь только один список строится, вызывается clear и используется LOAD_CONSTпоместить None в стек как с начальными значениями 1,2,3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...