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结果不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值