все Python 3Арифметика и операторыконструкция
del
присваивание
Оператор del удаляет имя, элемент, срез или атрибут. Удаляется ссылка, а не объект: объект живёт, пока на него ссылается что-то ещё.
Синтаксис
del name
del seq[i]
del seq[start:stop:step]
del d[key]
del obj.attr
После del x обращение к x даёт NameError, а внутри функции — UnboundLocalError. Если на список ссылается ещё b, del a не трогает данные: список удаляет сборщик мусора, когда пропадёт последняя ссылка, и только тогда вызывается __del__ — так что del obj и obj.__del__() вовсе не одно и то же. Чтобы очистить список, который видят другие имена, нужен del a[:] или a.clear(), а не del a. del lst[i] сдвигает хвост, поэтому удалять по индексам в цикле вперёд нельзя — индексы уплывают.
Примеры
a = [1, 2, 3]
b = a
del a # удалили имя, а не список
print(b) # → [1, 2, 3]
print(a) # → NameError: name 'a' is not defined
nums = list(range(10))
del nums[::2]
print(nums) # → [1, 3, 5, 7, 9]
d = {'x': 1, 'y': 2}
del d['x']
print(d) # → {'y': 2}
class P:
pass
p = P()
p.age = 30
del p.age
print(hasattr(p, 'age')) # → False
class Res:
def __del__(self):
print('объект удалён')
r = Res()
alias = r
del r
print('после del r') # → после del r — объект ещё жив
del alias # → объект удалён — ушла последняя ссылка (CPython)
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности