Перейти к содержимому

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

  • автор:

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()

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

Инструкция 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) #

5.4. Инструкция del

Существует способ удалить не только элемент по его значению, но и элемент с определённым индексом, элементы с индексами в определенном диапазоне (ранее мы производили эту операцию путем присваивания пустого списка срезу): инструкция del :

>>> a
[-1, 1, 66.6, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.6, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.6, 1234.5]

Инструкция del может быть также использована для удаления переменных:

После этого ссылка на переменную a будет генерировать исключение NameError , пока ей не будет присвоено другое значение. Позже мы расскажем о других применениях инструкции del .

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

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