使用 del 关键字 [duplicate] 从字典中删除项目

Removing items from dictionaries using del keyword [duplicate]

提问人: 提问时间:4/25/2023 最后编辑:Marcin Orlowski 更新时间:4/25/2023 访问量:65

问:

在使用 Python 语言方面,我是一个新手。我想知道为什么当有人使用变量引用项目时,不可能使用关键字从字典中删除该项目。似乎关键字只有在使用方括号格式时才有效,即 ] 为什么会这样?我提供了一个代码片段来帮助理解我的问题,并在回答问题时提供指导(不要忘记提及 id 的概念)。deldeldel 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}
>>> 
Python 字典 del

评论

0赞 JonSG 4/25/2023
这回答了你的问题吗?Python 变量是指针吗?否则,它们是什么?和/或 stackoverflow.com/questions/986006/...
0赞 Mark Tolonen 4/25/2023
给定 和 ,您是否也希望删除?你不应该,你也不应该期望删除。a=1b=adel badel first_namepersonal_details['f_name']

答:

1赞 UnsanitizedInput 4/25/2023 #1

调用时,您不是在调用字典值。 仅包含赋值时键“f_name”的值。 除了包含字典的值之一外,与您的字典无关。del first_namedelfirst_namefirst_name

此外,当您使用局部变量(如 )时,会将其从当前作用域中删除。这意味着变量名称可以重用,就好像它从未存在于当前作用域中一样。这就是为什么当您尝试在此处调用它后查看 的值时出现错误的原因:delfirst_namefirst_namedel

>>> first_name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'first_name' is not defined
0赞 Marcin Orlowski 4/25/2023 #2

TL;TR 在 Python 中,变量在技术上是对对象的引用,而不是对象本身。

当您创建()时,您不是在创建任何新对象,而是在创建对现有对象(即字符串)的引用。因为 dict 中的元素也是对 的引用,所以在赋值后,两者都指向内存中的同一个对象。这就是为什么为两个变量返回相同的值的原因。first_namefirst_name = personal_details['f_name']Imanif_namepersonal_detailsImanifirst_namepersonal_details['f_name']id()

删除则相反。使用 of 不是删除任何对象,而是删除之前创建的引用。但是目标对象不受影响,这就是为什么您可以安全地删除,即 dict 元素不受影响(反之亦然),即使它们指向同一个对象。最后,当你删除这两个引用时,就会变成孤立的,然后在某个时候它会被 Python 垃圾回收。delfirst_nameImani

评论

0赞 4/25/2023
为什么是 Imani'' 而不仅仅是参考(即)?尽管通过变量引用了仍然存在,假设它没有被删除。(*我希望我说清楚)del personal_details['f_name'] deletes the dictionary item with the value f_nameImanifirst_name
1赞 Marcin Orlowski 4/25/2023
您明确告诉 Python 删除带有 key 的元素。此元素的值无关紧要。删除该条目后,也不再需要它所持有的任何值。因此,引用被删除,因为它根本没有用。因此,删除引用是删除使用该特定引用的元素的结果。您可以保留该键,并且仍然通过简单地分配另一个值(即 或 )。这将删除旧的引用并创建新的,以保留新值的对象。有帮助吗?f_namefoo[key] = Nonefoo[key] = 'bar'
0赞 HWGuy 4/25/2023 #3

在我看来,使用 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