В чем разница между del a [:] и a = [], когда я хочу удалить список, называемый a в python?
Каков наиболее эффективный способ опорожнения списка?
У меня есть список под названием a = [1,2,3]
. Чтобы удалить содержимое списка, я обычно пишу a = [ ]
. Я наткнулся на функцию в python под названием del
. Я хочу знать, есть ли разница между del a [:]
и тем, что я использую.
Ответы
Ответ 1
Есть разница, и это связано с тем, ссылается ли этот список на несколько мест/имен.
>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print(b)
[]
>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(b)
[1, 2, 3]
Использование del a[:]
очищает существующий список, что означает, что в любом месте, на который он ссылается, станет пустой список.
Используя a = []
, установите a
, чтобы указать на новый пустой список, что означает, что другие места, на которые ссылается исходный список, остаются непустыми.
Ключом к пониманию здесь является осознание того, что когда вы присваиваете что-то переменной, оно просто заставляет это имя указывать на вещь. Вещи могут иметь несколько имен, и изменение имени указывает на то, что оно не меняет сама вещь.
Ответ 2
Это может быть лучше всего показано:
>>> a = [1, 2, 3]
>>> id(a)
45556280
>>> del a[:]
>>> id(a)
45556280
>>> b = [4, 5, 6]
>>> id(b)
45556680
>>> b = []
>>> id(b)
45556320
Когда вы выполняете a[:]
, вы ссылаетесь на все элементы в списке "назначено" на a
. Оператор del
удаляет ссылки на объекты. Итак, при выполнении del a[:]
говорится: "Удалите все ссылки на объекты из списка, назначенного a
". Сам список не изменился. Мы можем видеть это с помощью функции id, которая дает нам число, представляющее объект в памяти. Идентификатор списка перед использованием del
и после этого остается неизменным, указывая тот же объект списка на a
.
С другой стороны, когда мы назначаем непустой список b
, а затем присваиваем новый пустой список b
, идентификатор изменяется. Это связано с тем, что мы действительно переместили ссылку b
из существующего списка [4, 5, 6]
в новый список []
.
Помимо только тождества объектов, с которыми вы имеете дело, есть и другие вещи, о которых нужно знать:
>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a
[]
>>> print b
[]
Оба b
и a
относятся к тому же списку. Удаление элементов из списка a
без изменения самого списка изменяет список на месте. Поскольку b
ссылается на один и тот же объект, мы видим тот же результат. Если вы сделали a = []
вместо этого, то a
будет ссылаться на новый пустой список, а b
продолжает ссылаться на список [1, 2, 3]
.
Ответ 3
>>> list1 = [1,2,3,4,5]
>>> list2 = list1
Чтобы лучше понять, давайте посмотрим с помощью фотографий, которые происходят внутри.
>>> list1 = [1,2,3,4,5]
Это создает объект списка и назначает его list1
.
![Initialization of list1 in memory]()
>>> list2 = list1
Объект списка, к которому относится list1
, также присваивается list2
.
![]()
Теперь давайте рассмотрим методы для удаления списка и того, что на самом деле происходит внутри.
МЕТОД-1: установить в пустой список []:
>>> list1 = []
>>> list2
[1,2,3,4,5]
![Set list1 to empty list]()
Это не удаляет элементы списка, но удаляет ссылку на список. Таким образом, list1
теперь указывает на пустой список, но все остальные ссылки будут иметь доступ к этому старому list1
.
Этот метод просто создает новый объект списка и назначает его list1
. Любые другие ссылки останутся.
МЕТОД-2: удаление с помощью оператора среза [:]:
>>> del list1[:]
>>> list2
[]
![Delete all elements of list1 using slice operator]()
Когда мы используем оператор slice для удаления всех элементов списка, тогда все места, на которые он ссылается, становятся пустым. Таким образом, list2
также становится пустым.
Ответ 4
Ну, Del использует только немного меньше места в компьютере, как подразумевал человек выше меня. Компьютер все еще принимает переменную как один и тот же код, за исключением другого значения. Однако, когда переменной присваивается что-то другое, компьютер присваивает ему совершенно другой код, чтобы учесть изменение требуемой памяти.