Python 中用 tuple 作为 key,写的太详细了
''' 遇到问题没人解答?小编创建了一个 Python 学习交流 QQ 群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和 PDF 电子书! ''' >>> a = {} >>> a[1, 2] = 3 >>> a[1,2] 3 >>> a {(1, 2): 3} 还真的是。看到这里,我大概知道为啥了,因为 1, 2 其实是一个 tuple,tuple 是不可变对象,是 hashable 的,来验证一下。但是我没有 找到`__getitem__`的实现,不过我找到了`key in dict`这个操作的实现: /* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */ int PyDict_Contains(PyObject *op, PyObject *key) { Py_hash_t hash; Py_ssize_t ix; PyDictObject *mp = (PyDictObject *)op; PyObject *value; if (!PyUnicode_CheckExact(key) || (hash = ((PyASCIIObject *) key)->hash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; } ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value); if (ix == DKIX_ERROR) return -1; return (ix != DKIX_EMPTY && value != NULL); } /* Internal version of PyDict_Contains used when the hash value is already known */ int _PyDict_Contains(PyObject *op, PyObject *key, Py_hash_t hash) { PyDictObject *mp = (PyDictObject *)op; PyObject *value; Py_ssize_t ix; ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value); if (ix == DKIX_ERROR) return -1; return (ix != DKIX_EMPTY && value != NULL); } 可以看出来,只要`hash = PyObject_Hash(key);`这一步是成功的,就可以。也就是说,只要能算出 hash 值即可,那么我们可以来试试 把一个 class,重写 `__hash__`方法,来看看是否可以做 key: ''' 遇到问题没人解答?小编创建了一个 Python 学习交流 QQ 群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和 PDF 电子书! ''' class A(list): pass a = A() d = {} d[a] = 1 原本这样是会报错的: $ python test.py Traceback (most recent call last): ![](https://static001.geekbang.org/infoq/a7/a74ca620f34c4bb6888d6f206d64adae.png) 如果你也是看准了 Python,想自学 Python,在这里为大家准备了丰厚的免费**学习**大礼包,带大家一起学习,给大家剖析 Python 兼职、就业行情前景的这些事儿。 ### 一、Python 所有方向的学习路线 Python 所有方向路线就是把 Python 常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。 ![](https://static001.geekbang.org/infoq/e0/e03fd26f6c0917195450c6199bf5a2fd.png) ### 二、学习软件 工欲善其必先利其器。学习 Python 常用的开发软件都在这里了,给大家节省了很多时间。 ![](https://static001.geekbang.org/infoq/74/74032b26d9da5ee03e17a76e12edbb15.png) ### 三、全套 PDF 电子书 书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。 ![](https://static001.geekbang.org/infoq/22/222a67ec7a63430cd1a38da4c40c4d64.png) ### 四、入门学习视频 我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。 ![](https://static001.geekbang.org/infoq/c8/c839377ce45db4a46eaa5f64f5b28871.png) ![](https://static001.geekbang.org/infoq/79/796c29008052d2c5d1a0a30ef3b50e63.png) ### 四、实战案例 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。 ![](https://static001.geekbang.org/infoq/40/40fc2e4f5073880c93a277921a062e0a.png) ### 五、面试资料 我们学习 Python 必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。 ![](https://static001.geekbang.org/infoq/30/3082765585de5293d8850a9ce8389cea.png) 成为一个 Python 程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功! 最后祝你好运!!!
评论