Del python как работает
Перейти к содержимому

Del python как работает

  • автор:

Как работает функция 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()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *