Инструкция
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 = {"foo": 5, "bar": 8}
>>> del d["foo"]
>>> d
{'bar': 8}
А вот строки, байты и сеты
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 "<stdin>", line 1, in <module>
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 остается@pro_python_code