① 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,是不可迭代的,所以報錯。