提问人: 提问时间:4/25/2023 最后编辑:Marcin Orlowski 更新时间:4/25/2023 访问量:65
使用 del 关键字 [duplicate] 从字典中删除项目
Removing items from dictionaries using del keyword [duplicate]
问:
在使用 Python 语言方面,我是一个新手。我想知道为什么当有人使用变量引用项目时,不可能使用关键字从字典中删除该项目。似乎关键字只有在使用方括号格式时才有效,即 ] 为什么会这样?我提供了一个代码片段来帮助理解我的问题,并在回答问题时提供指导(不要忘记提及 id 的概念)。del
del
del dictionary[key
>>> personal_details = {'f_name': 'Imani', 'l_name': 'Ritcher', 'age': 25}
>>> first_name = personal_details['f_name']
>>> id(first_name)
139769037520176
>>> id(personal_details['f_name'])
139769037520176
>>> del first_name
>>> personal_details
{'f_name': 'Imani', 'l_name': 'Ritcher', 'age': 25}
>>> first_name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'first_name' is not defined
>>> del personal_details['f_name']
>>> personal_details
{'l_name': 'Ritcher', 'age': 25}
>>>
答:
调用时,您不是在调用字典值。 仅包含赋值时键“f_name”的值。 除了包含字典的值之一外,与您的字典无关。del first_name
del
first_name
first_name
此外,当您使用局部变量(如 )时,会将其从当前作用域中删除。这意味着变量名称可以重用,就好像它从未存在于当前作用域中一样。这就是为什么当您尝试在此处调用它后查看 的值时出现错误的原因:del
first_name
first_name
del
>>> first_name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'first_name' is not defined
TL;TR 在 Python 中,变量在技术上是对对象的引用,而不是对象本身。
当您创建()时,您不是在创建任何新对象,而是在创建对现有对象(即字符串)的引用。因为 dict 中的元素也是对 的引用,所以在赋值后,两者都指向内存中的同一个对象。这就是为什么为两个变量返回相同的值的原因。first_name
first_name = personal_details['f_name']
Imani
f_name
personal_details
Imani
first_name
personal_details['f_name']
id()
删除则相反。使用 of 不是删除任何对象,而是删除之前创建的引用。但是目标对象不受影响,这就是为什么您可以安全地删除,即 dict 元素不受影响(反之亦然),即使它们指向同一个对象。最后,当你删除这两个引用时,就会变成孤立的,然后在某个时候它会被 Python 垃圾回收。del
first_name
Imani
评论
del personal_details['f_name'] deletes the dictionary item with the value
f_name
Imani
first_name
f_name
foo[key] = None
foo[key] = 'bar'
在我看来,使用 dict.pop 更容易:
first_name = personal_details.pop('f_name', 'NoName')
在这种情况下,您可以同时获取和删除密钥, 如果由于某种原因已经丢失了密钥,则first_name 将从第二个参数(可选参数)中获取值 = 'NoName',而不是 KeyError 异常
>>> personal_details = {'f_name': 'Imani', 'l_name': 'Ritcher', 'age': 25}
>>> first_name = personal_details.pop('f_name', 'NoName')
>>> id(first_name)
1835077383472
>>> id(personal_details['f_name'])
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
id(personal_details['f_name'])
KeyError: 'f_name'
>>> del first_name
>>> personal_details
{'l_name': 'Ritcher', 'age': 25}
>>> first_name
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
first_name
NameError: name 'first_name' is not defined
评论
a=1
b=a
del b
a
del first_name
personal_details['f_name']