python dict clear只能删除一层,不能够递归删除。

 1 void
 2 PyDict_Clear(PyObject *op)
 3 {
 4     dictobject *mp;
 5     dictentry *ep, *table;
 6     int table_is_malloced;
 7     Py_ssize_t fill;
 8     dictentry small_copy[PyDict_MINSIZE];
 9 #ifdef Py_DEBUG
10     Py_ssize_t i, n;
11 #endif
12
13     if (!PyDict_Check(op))
14         return;
15     mp = (dictobject *)op;
16 #ifdef Py_DEBUG
17     n = mp->ma_mask + 1;
18     i = 0;
19 #endif
20
21     table = mp->ma_table;
22     assert(table != NULL);
23     table_is_malloced = table != mp->ma_smalltable;
24
25     /* This is delicate.  During the process of clearing the dict,
26      * decrefs can cause the dict to mutate.  To avoid fatal confusion
27      * (voice of experience), we have to make the dict empty before
28      * clearing the slots, and never refer to anything via mp->xxx while
29      * clearing.
30      */
31     fill = mp->ma_fill;
32     if (table_is_malloced)
33         EMPTY_TO_MINSIZE(mp);
34
35     else if (fill > 0) {
36         /* It‘s a small table with something that needs to be cleared.
37          * Afraid the only safe way is to copy the dict entries into
38          * another small table first.
39          */
40         memcpy(small_copy, table, sizeof(small_copy));
41         table = small_copy;
42         EMPTY_TO_MINSIZE(mp);
43     }
44     /* else it‘s a small table that‘s already empty */
45
46     /* Now we can finally clear things.  If C had refcounts, we could
47      * assert that the refcount on table is 1 now, i.e. that this function
48      * has unique access to it, so decref side-effects can‘t alter it.
49      */
50     for (ep = table; fill > 0; ++ep) {
51 #ifdef Py_DEBUG
52         assert(i < n);
53         ++i;
54 #endif
55         if (ep->me_key) {
56             --fill;
57             Py_DECREF(ep->me_key);
58             Py_XDECREF(ep->me_value);//只有这里处理了,但是如果value是一个字典,并且有其他地方引用了,那么就不能删掉了,我觉得应该递归删除       /*i         f(PyDict_Check(op->me_value))          {            PyDict_Clear(op->me_value);          }        else{

            Py_XDECREF(ep->me_value);
          }        */
59         }
60 #ifdef Py_DEBUG
61         else
62             assert(ep->me_value == NULL);
63 #endif
64     }
65
66     if (table_is_malloced)
67         PyMem_DEL(table);
68 }
时间: 2024-12-28 02:14:39

python dict clear只能删除一层,不能够递归删除。的相关文章

Node.js之删除文件夹(含递归删除)

应用场景:比如像Eclipse这样的IDE,右击项目,出现选项,点击选项中的删除,就可以删除这个项目及其下的子目录包含文件(使用electron开发的桌面端项目多少都会用到). 核心代码如下: /** * * @param {*} url */ function deleteFolderRecursive(url) { var files = []; /** * 判断给定的路径是否存在 */ if (fs.existsSync(url)) { /** * 返回文件和子目录的数组 */ files

python——dict详解

python3.0以上,print函数应为print(),不存在dict.iteritems()这个函数. 在python中写中文注释会报错,这时只要在头部加上# coding=gbk即可 #字典的添加.删除.修改操作 dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o" : "orange&qu

python dict 字典详解

和列表相同,字典也是许多数据的集合,属于可变序列类型.不同之处在于,它是无序的可变序列,其保存的内容是以“键值对”的形式存放的. 字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”. 字典类型很像学生时代常用的新华字典.我们知道,通过新华字典中的音节表,可以快速找到想要查找的汉字.其中,字典里的音节表就相当于字典类型中的键,而键对应的汉字则相当于值. 表 1 Python 字典特征 主要特征 解释 通过键而不是通过索引来读取元素 字

Python dict & set

1        Dict和Set 1.1   Dict(无序键值不可重复) Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list: names = ['Michael', 'Bob', 'Tracy'] scores = [95, 75, 85] 给定一个名字,要查找对应的成绩,就先要在names中找到对应

Python Dict用法

Operation Result len(a) the number of items in a 得到字典中元素的个数 a[k] the item of a with key k 取得键K所对应的值 a[k] = v set a[k] to v 设定键k所对应的值成为v del a[k] remove a[k] from a 从字典中删除键为k的元素 a.clear() remove all items from a 清空整个字典 a.copy() a (shallow) copy of a 得

vsftp实现只能上传不能下载、删除权限配置

vsftpd可以对每个用户特别限制.只要给那个用户建立一个设置文件,然后在文件里设置 在vsftpd.conf里加user_config_dir=/etc/vsftpd/vsftpd_user_conf,这是文件夹.当然你可以自己选把用户文件放在哪在此文件夹里新建一个文件,跟用户名相同.VSFTPD会比对用户名和用户设置文件. 在文件里加local_root=PATH to directory就可以更改用户的home directorylocal_max_rate=XXXX就可以限制此用户的带宽

Python dict 以 1和True 作为键值的比较

运行环境: 操作系统:Win7 64位 Python版本: 2.7.12 IDE:pycharm 2017.2 测试代码: 测试Python dict 1 和 True 作为键值 测试 demo 如下: #!/usr/bin/env python# -*- coding:utf-8 -*- __author__ = "liukang" dict_test = {}print dict_testdict_test[1] = 1print dict_testdict_test[True]

python dict 排序

我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value.可是有时我们需要对dictionary中 的item进行排序输出,可能根据key,也可能根据value来排.到底有多少种方法可以实现对dictionary的内容进行排序输出呢?下面摘取了 一些精彩的解决办法. python对容器内数据的排序有两种,一种是容器自己的sort函数,一种是内建的sorted函数. sort函数和sorted函数唯一的不同是,sort是在容器内(in-place)排序,so

Python dict.has_key() 的说明

Python dict.has_key()方法仅限于Python 2.x使用,对于3.x,此方法已废除. 对于Python 2.x中的dict.has_key()方法,官方文档的说明如下:https://docs.python.org/2/library/stdtypes.html#mapping-types-dict 对于Python 3.x中的dict相关方法,官方文档的说明如下:https://docs.python.org/3.7/library/stdtypes.html#mappin