python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...
職業發展
Python
如何看待某國內大公司Python面試題,有關dict中初始化為固定值?
閱讀下面的代碼,寫出A0,A1至A6的最終值。
A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
A4 = [i for i in A1 if i in A3]
A5 = {i:i*i for i in A1}
A6 = [[i,i*i] for i in A1]
答案在這里:
A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A2 = []
A3 = [1, 3, 2, 5, 4]
A4 = [1, 2, 3, 4, 5]
A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
請給出為什么A3= [1, 3, 2, 5, 4] 的理由,即A0初始化為什么為固定值
HTLiu ? ? 1502017-05-19 00:02:13
這個是根據Python2.X的dict的源碼來實現的, 主要是 PyDict_SetItem()這個函數, 在字典里面添加一個項的步驟是,先對key求hash值,之后hash值與掩碼mask做&操作,得到哈希表中空位置(slot),如果該位置未被占用,那key的槽就是它了,否則根據 開放定址 繼續尋找。 因此輸出的key的順序就是在哈希表中的順序,為什么是13254的原因如下:ln [16]: hash('a') & 7
Out[16]: 0
In [18]: hash('b') & 7
Out[18]: 3
In [19]: hash('c') & 7
Out[19]: 2
In [20]: hash('d') & 7
Out[20]: 5
In [21]: hash('e') & 7
Out[21]: 4
按照在哈希表中的順序就是: acbed, 對應到題目就是13254.
ps: 為什么&7 是因為初始默認大小是8:#define PyDict_MINSIZE 8 ,
掩碼mask=size-1,即:8-1 = 7.
如果元素個數超過了當前size的 2/3了,就會重新擴展。
蘇兆君 ? ? 22017-05-19 15:35:26
python2的結果:{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
python3的結果:{'a': 1, 'd': 4, 'e': 5, 'b': 2, 'c': 3}
我就很訥悶了,招這樣的人是來寫Python解釋器的還是寫Python項目的。出題的人不去考Python庫的知識面,來考數據在Python在解釋器中的生成規則,就像你做飯不去考慮怎樣去做熟它,而是去考慮這些米施了多少肥才長這么飽滿。
HTLiu ? ? 12017-05-19 17:21:55
哈哈 原來是釣魚貼
Qing Meng ? ? 12017-05-19 15:27:02
我win10+Python 3.6.0以及ubuntu 1604+Python 3.5.2上都測試hash('a'),hash('b')的結果,每次都不一樣,不知道為什么。
HTLiu ? ? 12017-05-19 14:41:13
就是對哈希表resize, 然后將舊表數據復制到新表, 再對元素進行hash。
Qing Meng ? ? 02017-05-21 14:55:46
這個不太理解。'a'這個字符字面量在python中的表示跟content為'a'的字符串對象不一樣嗎?
安瀾 ? ? 02017-05-21 13:39:52
要注意你是對"a"這個字符hash還是content為"a"的字符串對象hash
王浩淼 ? ? 02017-05-19 20:08:47
牛逼,學習了,感謝
劉順裕 ? ? 02017-05-19 16:09:17
其實我有答案,您的答案是我期望得到的,我也是翻閱了文檔查看了dict源碼和默認設置
Qing Meng ? ? 02017-05-19 15:51:43
謝謝解答!
HTLiu ? ? 02017-05-19 15:47:01
哈哈,的確是。python對dict的優化每個版本都有不一樣的,據說python3.6對dict又是一次大改動,性能提高了不少。 不過在python2.x dict已經固定了,只是小改小鬧。 python3.x 變化較大。
HTLiu ? ? 02017-05-19 15:42:52
上述的所有均是基于 Python 2.X, 開頭也聲明了。 Python3.X的dict 機制有很大不一樣。甚至python3.6和python3.5 都變化很大,具體python3.x 沒有研究過。 因為python的很多對象均是靠字典來維護的,因此每一個大版本都會對dict 做優化。
HTLiu ? ? 02017-05-19 14:46:00
不會吧, 我在雙系統(win 10, ubuntu 1604) 均測試了三種情況都是, acbed, 有截圖復現嗎
知乎用戶 ? ? 02017-05-19 14:40:06
感激,學習了!
王奕嵐 ? ? 02017-05-19 14:22:43
學習了!請問擴展機制是什么?
codog ? ? 02017-05-19 14:21:02
我在pycharm上執行結果完全隨機的,在ipython下執行是12345,在cmd下執行才有13254的結果,都是一個python解釋器(版本2.7.12),為何?
HTLiu ? ? 02017-05-19 08:08:02
應該是一樣的。我記得python源碼中采取的hash函數是一種比較常規的hash算法,是固定的。此外我也測試了同一系統下不同的python進程得到的hash值是一樣的呀。如果32位/64位的機器或許會不一樣。
知乎用戶 ? ? 02017-05-19 08:03:14
謝謝
Qing Meng ? ? 02017-05-19 01:03:14
謝謝,學習了
有個問題,每次啟動python解釋器,都能夠保證一個字符串(例如'a')的hash值相同的嗎?
不同python解釋器進程,built-in的hash()函數似乎對同一個字符串的hash結果不一樣。
總結
以上是生活随笔為你收集整理的python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科学数字_七年级数学上册:科学记数法、有
- 下一篇: java格式_JAVA语言格式