说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python del 语句可以删除一些对象的引用,可以是单个或多个对象的引用。它也可以从类似列表中按照给定的索引而不是值来移除一个元素。
del 语句的语法是:
del obj_name # 单个
del obj_name_a, obj_name_b # 多个
del obj_name[a] # 删除元素
这里,obj_name 可以是变量、用户定义的对象、列表、列表中的项、字典等。
我们来看一下示例:
a = 1
b = 2
c = 3
del a, b
a # 删除后找不到这个名称了
# NameError: name 'a' is not defined
c
# 3
# 删除元素(项)
l = ['a', 'b', 'c']
del l[-1]
l
# ['a', 'b']
del l[:] # 清空
l
# []
del l # 注意与以上区分
l
# NameError: name 'l' is not defined
d = {'x': 1, 'y': 2}
del d['y']
d
# {'x': 1}
Python有 GC (垃圾回收)机制,所以,del 语句作用在变量上,而不是数据对象上(数据本身暂时不会被删除)。如:
a = 1 # 对象 1 被 变量a引用,对象1的引用计数器为1
b = a # 对象1 被变量b引用,对象1的引用计数器加1 = 2
c = a # 1对象1 被变量c引用,对象1的引用计数器加1 = 3
del a # 删除变量a,解除a对1的引用
del b # 删除变量b,解除b对1的引用
print(c) # 最终变量c仍然引用1
# 1
删除是递归定义的,与赋值的定义方式非常类似。 此处不再详细说明,只给出一些提示。
目标列表的删除将从左至右递归地删除每一个目标。
名称的删除将从局部或全局命名空间中移除该名称的绑定,具体作用域的确定是看该名称是否有在同一代码块的 global 语句中出现。 如果该名称未被绑定,将会引发 NameError。
属性引用、抽取和切片的删除会被传递给相应的原型对象;删除一个切片基本等价于赋值为一个右侧类型的空切片(但即便这一点也是由切片对象决定的)。
在 3.2 版更改: 在之前版本中,如果一个名称作为被嵌套代码块中的自由变量出现,则将其从局部命名空间中删除是非法的。
对象实现可以实现以下特殊方法:
object.__del__(self)
在实例将被销毁时调用。 这还被称为终结器或析构器(不适当)。 如果一个基类具有 __del__()
方法,则其所派生的类如果也有 __del__()
方法,就必须显式地调用它以确保实例基类部分的正确清除。
__del__()
方法可以 (但不推荐!) 通过创建一个该实例的新引用来推迟其销毁。这被称为对象 重生。__del__()
是否会在重生的对象将被销毁时再次被调用是由具体实现决定的 ;当前的 CPython 实现只会调用一次。
当解释器退出时不会确保为仍然存在的对象调用 __del__()
方法。
备注:del x
并不直接调用 x.__del__()
--- 前者会将 x 的引用计数减一,而后者仅会在 x 的引用计数变为零时被调用。
class T:
def __del__(self):
print("deleted")
t = T()
del t
# deleted
模拟容器类型的类型可以实现以下特殊方法:
object.__delitem__(self, key)
调用此方法以实现 self[key]
的删除。注意事项与 __getitem__()
相同。为对象实现此方法应该权限于需要映射允许移除键,或是序列允许移除元素时。不正确的 key 值所引发的异常应与 __getitem__()
方法的情况相同。
自定义属性也可以实现以下特殊方法:
object.__delattr__(self, name)
类似于 __setattr__()
但其作用为删除而非赋值。此方法应该仅在 del obj.name 对于该对象有意义时才被实现。
引发一个 审计事件 object.__delattr__
,附带参数 obj, name。
class MyClass:
a = 10
def func(self):
print('Hello')
# Output:
print(MyClass)
# deleting MyClass
del MyClass
# Error: MyClass is not defined
print(MyClass)
在程序中,我们使用del MyClass语句删除了MyClass。
my_var = 5
my_tuple = ('Sam', 25)
my_dict = {'name': 'Sam', 'age': 25}
del my_var
del my_tuple
del my_dict
# Error: my_var is not defined
print(my_var)
# Error: my_tuple is not defined
print(my_tuple)
# Error: my_dict is not defined
print(my_dict)
del 语句可用于删除给定索引处的项。它还可以用于从列表中删除切片。
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# deleting the third item
del my_list[2]
# Output: [1, 2, 4, 5, 6, 7, 8, 9]
print(my_list)
# deleting items from 2nd to 4th
del my_list[1:4]
# Output: [1, 6, 7, 8, 9]
print(my_list)
# deleting all elements
del my_list[:]
# Output: []
print(my_list)
再来一个:
sample = [3, None, 2, 4, None, 5, 2]
del sample[4], sample[1]
sample
# [3, 2, 4, 5, 2]
person = { 'name': 'Sam',
'age': 25,
'profession': 'Programmer'
}
del person['profession']
# Output: {'name': 'Sam', 'age': 25}
print(person)
注意:Python中不能删除元组和字符串的项。这是因为元组和字符串是不可变的,创建后无法更改的对象。
my_tuple = (1, 2, 3)
# Error: 'tuple' object doesn't support item deletion
del my_tuple[1]
但是,您可以删除整个元组或字符串。
my_tuple = (1, 2, 3)
# deleting tuple
del my_tuple
Python 内容函数 delattr(object, name)
可以删除对象属性。
更新时间:2023-09-08 12:29:32 标签:python del