① python中UserDict和dict
你看看UserDict的代码就知道了。
clear的代码里只有一句:self.data.clear()
而update则有两种情况:
1. 你传入的参数是一个dict,或者是命名参数(a='x',b='y'..这样的形式)直接调用self.data.update
2. 你传入的参数有items属性则for k,v in 参数.items(): self[k]=v
说白了就是UserDict重新包装了作为.data属性的dict,所以可以直接调用;而且有些UserDict的方法还有一些它自己的逻辑,增加一点点功能。
② python 为什么中文字符串在dict会乱码
Python在执行过程中,常常出现不能读取中文路径名,表现为读取的路径是空或者直接报错(WindowsError: [Error 2]);也有时候出现不能正常输出中文字符串,编译器报错为(KeyError),这是编码出现了问题。这个时候在字符串后面添加转码操作即可。
详见源码示例如下
【中文字符串】
[python] view plain
print '品牌id'.decode('utf-8')
print '\xe5\x93\x81\xe7\x89\x8cid'.decode('utf-8')
上面两行输出结果是一致的。
【中文路径读取文件】
[python] view plain
# 获取当前路径下的文件夹
import numpy as np
from os.path import exists, isdir, basename, join, splitext
from glob import glob
data_path = 'F:\\wfpdm\\My_Proc_Data_ZXTZ\\美国数据库\\ 自相\
关特征\\'.decode('utf-8')
cat_paths = glob(data_path + "*")
cat_paths.sort()
cats = [basename(cat_path) for cat_path in cat_paths]
③ python dict字典问题,跪求大神看看
dict的key是唯一的,重复的key-value,新的value会覆盖掉旧的value。
④ python dict怎么实现的
Python中dict对象是表明了其是一个原始的Python数据类型,按照键值对的方式存储,其中文名字翻译为字典,顾名思义其通过键名查找对应的值会有很高的效率,时间复杂度在常数级别O(1).dict底层实现(推荐学习:Python视频教程)
在Python2中,dict的底层是依靠哈希表(Hash Table)进行实现的,使用开放地址法解决冲突.
所以其查找的时间复杂度会是O(1).
Dict的操作实现原理(包括插入、删除、以及缓冲池等)
首先介绍:PyDictObject对象的元素搜索策略:
有两种搜索策略,分别是lookdict和lookdict_string,lookdict_string就是lookdict在对于PyStringObject进行搜索时的特殊形式,那么通用的搜索策略lookdict的主要逻辑是:
(1)对第一个entry的查找:
a)根据hash值获得entry的索引
b)若entry处于unused态,则搜索结束;若entry所指向的key与搜索的key相同,则搜索成功
c)若当前entry处于mmy态,则设置freeslot(这里的freeslot是可以返回作为下一个立即可用的地址来存储entry)
d)检查Active态的entry,若其key所指向的值与搜索的值相同,则搜索成功
(2)对剩余的探测链中的元素的遍历查找:
a)根据所采用的探测函数,获得探测链上的下一个待检查的entry
b)检查到一个unused态的entry,表明搜索失败:
如果freeslot不为空,则返回freeslot;否则返回unused态的entry
c)检查entry的key与所搜索的key的引用是否相同,相同则搜索成功,返回entry
d)检查entry的key与所搜索的key的值是否相同,相同则搜索成功,返回entry
e)遍历过程中,发现mmy态的entry,且freeslot未设置,则设置freeslot
接下来是:PyDictObject对象的元素插入与删除的策略:
需要首先用到搜索策略,搜索成功,则直接将值进行替换,搜索失败,返回unused态或mmy态的entry,设置key、value和hash值,并且根据目前插入的元素情况进行ma_table的大小的调整(调整的依据就是装载率,根据是否大于2/3来进行调整);删除也是类似,先计算hash值,然后搜索相应的entry,搜索成功,删除entry中维护的元素,将entry从Active态修改为mmy态
在PyDictObject的实现过程中,会用到缓冲池,在PyDictObject对象被销毁的时候,才开始接纳被缓冲的PyDictObject对象,定义的缓冲池可接纳的对象数量是80个,创建新PyDictObject对象的时候,如果缓冲池中有,则可以直接从缓冲池中取出使用
更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于python dict怎么实现的的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!
⑤ Python中dict为什么比list浪费内存求大神,感激不尽!!
不知道你对c有没有了解,python解释器就是基于c写的,这个两个数据结构应该对应c的哈希表和数组。
因为哈希表需要额外内存记录映射关系,而数组只需要通过索引就能计算出下一个节点的位置,所以哈希表占用的内存比数组大,也就是dict比list占用的内存大些。
不过使用python说明对性能没有极端的要求,具体使用哪个主要还是要看项目的需要。
如果解决了您的问题请采纳!
如果未解决请继续追问
⑥ Python源码剖析的作品目录
第0章 PYTHON源码剖析--编译PYTHON
0.1 PYTHON总体架构
0.2 PYTHON源代码的组织
0.3 WINDOWS环境下编译PYTHON
0.4 UNIX/LINUX环境下编译PYTHON
0.5 修改PYTHON源代码
0.6 通往PYTHON之路
0.7 一些注意事项
第1部分 PYTHON内建对象
第1章 PYTHON对象初探
1.1 PYTHON内的对象
1.1.1 对象机制的基石——PyObject
1.1.2 定长对象和变长对象
1.2 类型对象
1.2.1 对象的创建
1.2.2 对象的行为
1.2.3 类型的类型
1.3 PYTHON对象的多态性
1.4 引用计数
1.5 PYTHON对象的分类
第2章 PYTHON中的整数对象
2.1 初识PYINTOBJECT对象
2.2 PYINTOBJECT对象的创建和维护
2.2.1 对象创建的3种途径
2.2.2 小整数对象
2.2.3 大整数对象
2.2.4 添加和删除
2.2.5 小整数对象池的初始化
2.3 HACK PYINTOBJECT
第3章 PYTHON中的字符串对象
3.1 PYSTRINGOBJECT与PYSTRING_TYPE
3.2 创建PYSTRINGOBJECT对象
3.3 字符串对象的INTERN机制
3.4 字符缓冲池
3.5 PYSTRINGOBJECT效率相关问题
3.6 HACK PYSTRINGOBJECT
第4章 PYTHON中的LIST对象
4.1 PYLISTOBJECT对象
4.2 PYLISTOBJECT对象的创建与维护
4.2.1 创建对象
4.2.2 设置元素
4.2.3 插入元素
4.2.4 删除元素
4.3 PYLISTOBJECT对象缓冲池
4.4 HACK PYLISTOBJECT
第5章 PYTHON中的DICT对象
5.1 散列表概述
5.2 PYDICTOBJECT
5.2.1 关联容器的entry
5.2.2 关联容器的实现
5.3 PYDICTOBJECT的创建和维护
5.3.1 PyDictObject对象创建
5.3.2 PyDictObject中的元素搜索
5.3.3 插入与删除
5.3.4 操作示例
5.4 PYDICTOBJECT对象缓冲池
5.5 HACK PYDICTOBJECT
第6章 最简单的PYTHON模拟——SMALL PYTHON
6.1 SMALL PYTHON
6.2 对象机制
6.3 解释过程
6.4 交互式环境
第2部分 PYTHON虚拟机
第7章 PYTHON的编译结果--CODE对象与PYC文件
7.1 PYTHON程序的执行过程
7.2 PYTHON编译器的编译结果--PYCODEOBJECT对象
7.2.1 PyCodeObject对象与pyc文件
7.2.2 Python源码中的PyCodeObject
7.2.3 pyc文件
7.2.4 在Python中访问PyCodeObject对象
7.3 PYC文件的生成
7.3.1 创建pyc文件的具体过程
7.3.2 向pyc文件写入字符串
7.3.3 一个PyCodeObject,多个PyCodeObject
7.4 PYTHON的字节码
7.5 解析PYC文件
第8章 PYTHON虚拟机框架
8.1 PYTHON虚拟机中的执行环境
8.1.1 Python源码中的PyFrameObject
8.1.2 PyFrameObject中的动态内存空间
8.1.3 在Python中访问PyFrameObject对象
8.2 名字、作用域和名字空间
8.2.1 Python程序的基础结构——mole
8.2.2 约束与名字空间
8.2.3 作用域与名字空间
8.3 PYTHON虚拟机的运行框架
8.4 PYTHON运行时环境初探
第9章 PYTHON虚拟机中的一般表达式
9.1 简单内建对象的创建
9.2 复杂内建对象的创建
9.3 其他一般表达式
9.3.1 符号搜索
9.3.2 数值运算
9.3.3 信息输出
第10章 PYTHON虚拟机中的控制流
10.1 PYTHON虚拟机中的IF控制流
10.1.1 研究对象--if_control.py
10.1.2 比较操作
10.1.3 指令跳跃
10.2 PYTHON虚拟机中的FOR循环控制流
10.2.1 研究对象——for_control.py
10.2.2 循环控制结构的初始化
10.2.3 迭代控制
10.2.4 终止迭代
10.3 PYTHON虚拟机中的WHILE循环控制结构
10.3.1 研究对象——while_control.py
10.3.2 循环终止
10.3.3 循环的正常运转
10.3.4 循环流程改变指令之continue
10.3.5 循环流程改变指令之break
10.4 PYTHON虚拟机中的异常控制流
10.4.1 Python中的异常机制
10.4.2 Python中的异常控制语义结构
第11章 PYTHON虚拟机中的函数机制
11.1 PYFUNCTIONOBJECT对象
11.2 无参函数调用
11.2.1 函数对象的创建
11.2.2 函数调用
11.3 函数执行时的名字空间
11.4 函数参数的实现
11.4.1 参数类别
11.4.2 位置参数的传递
11.4.3 位置参数的访问
11.4.4 位置参数的默认值
11.4.5 扩展位置参数和扩展键参数
11.5 函数中局部变量的访问
11.6 嵌套函数、闭包与DECORATOR
11.6.1 实现闭包的基石
11.6.2 闭包的实现
11.6.3 Decorator
第12章 PYTHON虚拟机中的类机制
12.1 PYTHON中的对象模型
12.1.1 对象间的关系
12.1.2 和
12.2 从TYPE对象到CLASS对象
12.2.1 处理基类和type信息
12.2.2 处理基类列表
12.2.3 填充tp_dict
12.3 用户自定义CLASS
12.3.1 创建class对象
12.4 从CLASS对象到INSTANCE对象
12.5 访问INSTANCE对象中的属性
12.5.1 instance对象中的__dict__
12.5.2 再论descriptor
12.5.3 函数变身
12.5.4 无参函数的调用
12.5.5 带参函数的调用
12.5.6 Bound Method和Unbound Method
12.6 千变万化的DESCRIPTOR
第3部分 PYTHON高级话题
第13章 PYTHON运行环境初始化
13.1 线程环境初始化
13.1.1 线程模型回顾
13.1.2 初始化线程环境
13.2 系统MODULE初始化
13.2.1 创建__builtin__ mole
13.2.2 创建sys mole
13.2.3 创建__main__ mole
13.2.4 设置site-specific的mole的搜索路径
13.3 激活PYTHON虚拟机
13.3.1 交互式运行方式
13.3.2 脚本文件运行方式
13.3.3 启动虚拟机
13.3.4 名字空间
第14章 PYTHON模块的动态加载机制
14.1 IMPORT前奏曲
14.2 PYTHON中IMPORT机制的黑盒探测
14.2.1 标准import
14.2.2 嵌套import
14.2.3 import package
14.2.4 from与import
14.2.5 符号重命名
14.2.6 符号的销毁与重载
14.3 IMPORT机制的实现
14.3.1 解析mole/package树状结构
14.3.2 加载mole/pakcage
14.3.3 from与import
14.4 PYTHON中的IMPORT操作
14.4.1 import mole
14.4.2 import package
14.4.3 from & import
14.4.4 import & as
14.4.5 reload
14.4.6 内建mole:imp
14.5 与MODULE有关的名字空间问题
第15章 PYTHON多线程机制
15.1 GIL与线程调度
15.2 初见PYTHON THREAD
15.3 PYTHON线程的创建
15.3.1 建立多线程环境
15.3.2 创建线程
15.4 PYTHON线程的调度
15.4.1 标准调度
15.4.2 阻塞调度
15.5 PYTHON子线程的销毁
15.6 PYTHON线程的用户级互斥与同步
15.6.1 用户级互斥与同步
15.6.2 Lock对象
15.7 高级线程库——THREADING
15.7.1 Threading Mole概述
15.7.2 Threading的线程同步工具
15.7.3 Threading中的Thread
第16章 PYTHON的内存管理机制
16.1 内存管理架构
16.2 小块空间的内存池
16.2.1 Block
16.2.2 Pool
16.2.3 arena
16.2.4 内存池
16.3 循环引用的垃圾收集
16.3.1 引用计数与垃圾收集
16.3.2 三色标记模型
16.4 PYTHON中的垃圾收集
16.4.1 可收集对象链表
16.4.2 分代的垃圾收集
16.4.3 Python中的标记-清除方法
16.4.4 垃圾收集全景
16.4.5 Python中的gc模块
16.4.6 总结
⑦ Python.如何向字典dict里加入内容a
1、创建字典
dict={'d':1,'b':2,'c':3}
2、添加内容a
>>>dict['a']=500
>>>a
{'d':1,'b':2,'c':3,'a':500}‘
python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。
Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。
由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。
(7)pythondict源码扩展阅读:
PYTHON的特点
Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。
所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。
Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。
Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。
因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。
《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在Google内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用 C++,在快速开发时候使用 Python。”
参考资料:python-语言参考
⑧ Python中,dict(((1,2),(2,3)))可以,为什么dict((1,2))会报错呢
答案:因为dict((1,2))中的参数(1,2)的第一个元素1是不可迭代的,所以报错。具体分析如下:
dict()的机制如下
报错的原因在于列表的第一项中只有一个元素,并且不可迭代。也就无法拆包。对应于dict((1,2))中的参数是(1,2),这个参数的第一个元素是整数1,是不可迭代的,所以报错。