Как работает функция del в Python?
Ключевое слово del служит для удаления объектов. Так как в Python все объект, то этим ключевым словом можно удалять функции, переменные, списки или элементы списков:
# удаление переменной x = "hello" del x print(x) # => NameError: name 'x' is not defined
# удаление элемента списка x = ['apple', 'banana', 'cherry'] del x[0] print(x) # => ['banana', 'cherry']
Python: все про del

Инструкция del (от англ. delete), как можно понять из названия, нужна чтобы что-то удалять, а именно имена переменных, атрибуты объектов, элементы списков и ключи словарей.
1. Удаление элемента из списка по индексу:
>>> x = [1, 2, 3, 4, 5] >>> del x[2] >>> x [1, 2, 4, 5]
Также можно удалять по срезам. Пример: удаление первых двух элементов:
>>> x = [1, 2, 3, 4, 5] >>> del x[:2] >>> x [3, 4, 5]
Удаление последних n элементов: del x[n:] .
Удаление элементов с четными индексами: del x[::2] , нечетными: del x[1::2] .
Удаление произвольного среза: del x[i:j:k] .
Не путайте del x[2] и x.remove(2) . Первый удаляет по индексу (нумерация с 0), а второй по значению, то есть находит в списке первую двойку и удаляет ее.
2. Удаление ключа из словаря. Просто:
>>> d = >>> del d[«foo»] >>> d
А вот строки, байты и сеты del не поддерживают.
3. Удаление атрибута объекта.
class Foo: def __init__(self): self.var = 10 f = Foo() del f.var print(f.var) # ошибка!
Примечание: можно через del удалить метод у самого класса del Foo.method , но нельзя удалить метод у экземпляра класса del Foo().method – AttributeError.
4. Что значит удалить имя переменной? Это просто значит, что надо отвязать имя от объекта (при этом если на объект никто более не ссылается, то он будет освобожден сборщиком мусора), а само имя станет свободно. При попытке доступа к этому имени после удаления будет NameError, пока ему снова не будет что-то присвоено.
>>> a = 5 >>> del a >>> a Traceback (most recent call last): File "", line 1, in NameError: name 'a' is not defined
Здесь кроется один нюанс. Если переменная была внутри функции помечена, как global, то после ее удаления глобальная переменная никуда не денется, а имя освободится лишь в зоне видимости функции. Причем если мы снова присвоим ей значение, то она опять окажется глобальной, т.е. del не очищает информацию о global!
g = 100 def f(): global g g = 200 del g # g останется вне функции g = 300 # та же самая глобальная g f() print(g) # 300
Чтобы реально удалить глобальную переменную, можно сделать так: del globals()[‘g’] .
В пунктах 1, 2, 3 в качестве имен могут фигурировать выражения и ссылки, так как операции идут над содержимым объектов, а в пункте 4 должно быть строго формальное имя удаляемого объекта.
>>> x = [1, 2, 3] >>> y = x >>> del y # удаляет именно y, но x остается
Еще одна особенность del – она может удалить несколько вещей за раз, если передать в нее кортеж или список объектов на удаление.
x, y, z = 10, 20, [1, 2, 3] del x, y, z[2]
Пусть задан список из 5 элементов:
x = [1, 2, 3, 4, 5] del x[2], x[4]
Казалось бы, что будут удалены 2-й и 4-й элементы списка, но это не так! Удаления происходят один за одним, и сначала будет удален 2-й элемент, размер списка уменьшится на 1, а потом будет попытка удалить 4-й элемент, но она будет неудачна – вылетит исключение IndexError, потому что элемента с индексом 4 больше нет, а сам список будет равен [1, 2, 4, 5]. Так что будьте внимательны в подобных ситуациях!
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
Инструкция del
Несмотря на свое название, инструкция del не удаляет объекты в буквальном смысле, она лишь открепляет ссылки, разрывая связь между именем и объектом. Удаление объекта произойдет как следствие работы сборщика мусора в отношении объектов, на которые больше не ссылается ни один другой объект.
- del variable — удаление переменной,
- del obj.attr — удаление атрибута,
- del data[k] — удаление элемента по индексу или ключу в случае словаря,
- del data[i:j] — удаление элементов по срезу.
Инструкция del состоит из ключевого слова del , за которым следует одна или несколько целевых ссылок, разделенных запятыми. Каждая целевая ссылка может быть переменной, ссылкой на атрибут, индексированным элементом или срезом и должна быть связана с каким-либо объектом. Если целевая ссылка является переменной, выполнение инструкции del означает разрыв связи между объектом и закрепленной за ним переменной. Если эта операция запрашивается, она всегда выполняется.
Во всех остальных случаях инструкция del определяет запрос к объекту на открепление одного или нескольких его атрибутов или элементов. Объект может отказать в выполнении этой операции по отношению к некоторым/всем атрибутам или элементам, бросая исключение при попытке отмены связывания в тех случаях, когда это запрещено.
Контейнерам разрешено сопровождать выполнение инструкции del побочными эффектами. Например, предположим что array — это словарь и инструкция del array[2] успешно выполнена, то это означает, что следующие обращения к элементу array[2] будут недопустимыми и приведут к возбуждению исключения KeyError . Такое поведение будет до тех пор, пока array[2] вновь не присвоим некоторое значение. Но если array — это список, то в результате выполнения инструкции del array[2] каждый последующий элемент сместится на одну позицию влево и последующие обращения к array[2] будут по прежнему действительными, хотя будут давать другое значение.
Пример:
a = [1, ‘not’, 10, ‘in’] del a[2] print(a) # [1, ‘not’, ‘in’] b = [‘foo’, ‘array’, 20] x = b.append(a) # удаляем из вложенного списка del b[3][2] print(b) # [‘foo’, ‘array’, 20, [1, ‘not’]] one = [‘foo’, 1, 2, 3] two = [10, 20, ‘foo’, 30] three = [11, ‘foo’, 22, 33] # удаляем одновременно из всех списков del one[0], two[2], three[1] print(one, two, three) # [1, 2, 3] [10, 20, 30] [11, 22, 33] x = ‘year’: «2020», ‘month’: «01», ‘day’: «01»> y = ‘artist’: «Beethoven», ‘title’: ‘Symphony No 5’> del x[‘day’], y[‘artist’] print(x, y) #
Del python как работает
del от delete (англ.) — удалить.
del name
del name[i]
del name[i:j:k]
del name.attribute
На заметку
В первой форме name — это имя переменной, взятое буквально. В последних трех формах name может являться выражением.
- Удаление нескольких целей рекурсивно удаляет каждую цель слева направо.
- Удаление имени удаляет привязку этого имени из локального или глобального пространства имен (в зависимости от того, были ли определено имя при помощи инструкции global в том же блоке кода). Если имя не привязано, возбуждается исключение NameError.
- Удаление ссылок на атрибуты, элементов и срезов передаётся базовому объекту (носителю) и осуществляется им. Удаление среза, в целом, эквивалентно присвоению пустого среза (однако и оно определяется самим объектом среза).
| del variable | удаление переменной |
| del obj.attr | удаление атрибута |
| del data[k] | удаление элемента по индексу |
| del data[i:j] | удаление элементов по срезу |
my_list = [123, 'spam', 1.23, 'NI']
del my_list[2]
my_list # [123, 'spam', 'NI']
another_list = ['abc', my_list, 42]
del another_list[1][2] # удаляем ‘NI’ из вложенного списка my_list
my_list # [123, 'spam']
list_one = ['spam', 1, 11, 111]
list_two = [2, 22, 'spam', 222]
list_three = [3, 'spam', 33, 333]
del list_one[0], list_two[2], list_three[1] # удаляем spam одновременно из трёх списков
+py3.2: Разрешено удаление имени из локального пространства имён, если оно используется во вложенном блоке как несвязанное (не было определено в рамках того же блока). Ранее в таких случаях возбуждалось SyntaxError:
def print_done():
some = 'some'
del some
# До Python 3.2 в подобных случаях инструкция вызывает SyntaxError:
# can not delete variable 'some' referenced in nested scope
def print_some():
print(some)
print('done')
print_done()