Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

14 | 答疑(一):列表和元组的内部实现是怎样的?

景霄 2019-06-10
你好,我是景霄。
转眼间,专栏上线已经一个月了,而我们也在不知不觉中完成了第一大章基础篇的学习。我非常高兴看到很多同学一直在坚持积极地学习,并且留下了很多高质量的留言,值得我们互相思考交流。也有一些同学反复推敲,指出了文章中一些表达不严谨或是不当的地方,我也表示十分感谢。
大部分留言,我都在相对应的文章中回复过了。而一些手机上不方便回复,或是很有价值很典型的问题,我专门摘录了出来,作为今天的答疑内容,集中回复。

问题一:列表和元组的内部实现

第一个问题,是胡峣同学提出的,有关列表(list)和元组(tuple)的内部实现,想知道里边是 linked list 或 array,还是把 array linked 一下这样的方式?
关于这个问题,我们可以分别从源码来看。
先来看 Python 3.7 的 list 源码。你可以先自己阅读下面两个链接里的内容。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • 夜路破晓
    个人认知:感觉会看源码的人都很牛!我也想成人牛人,那么问题来了:
    如何学习看源码?

    作者回复: 根据需求,首先了解每一个block,每一个函数的大概意思,然后看下去,不懂的多去google一下,看多了你的水平自然就提高了

    2019-06-10
    32
  • SCAR
    对于问题四的2而言,是因为python是动态语言,不要求声明变量,但是约定在函数体中赋值的变量是局部变量,所以需要理解的是“赋值”这个动作,不管是常规的完整赋值或是增强赋值,只有函数体内初次出现赋值就认为定义了局部变量。这样你就很好理解了,老师的例子中x+=1,出现了赋值,那么这个x就是局部变量了,而x+=1这个增强赋值的第二步会去找函数体内x的引用,于是就出现了找不到的错误。如果把x+=1改成print(x),则是打印出1,因为函数体没出现赋值,那么这个x是最上面赋值的x,它是全局的。
    2019-06-10
    3
    18
  • yshan
    重新查了下理解了下多态:多态就是多种形态。 有了继承,才有多态了。 继承了就具有父类的方法,然后子类就能够覆写父类方法,子类就能够调用该方法实现自己的需求。
    2019-06-10
    7
  • 阿卡牛
    over-allocate是什么意思

    作者回复: 会分配比实际元素多的空间,比如一个array实际有5个元素,但是如果是over-allocate的array,可能会分配10个元素的空间大小

    2019-06-10
    6
  • 小侠龙旋风
    1.细看了over-allocated分配空间大小的增长规律,4 4 8 9 10 11 12...不知道这样设计的缘由。
    2."当tuple的大小不超过20时,Python会把它缓存在内部的一个free list中。"这句话突然让我想起了小整数池。
    小整数池的概念:Python提前建立好范围在[-5, 256]的整数对象,且不会被垃圾回收。无论这个整数处于LEGB中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。
    主要目的是为了避免频繁申请和销毁小整数的内存空间,提高程序的运行效率。
    3.说一下我所理解的新哈希表的设计思想:
    indice下标,entry入口。用下标去寻找对应元素。
    维护一个数据量较小的结构,去访问一个数据量较大的结构。
    同理,也被运用于函数:
    函数的本质是在堆Heap中放置的对象;
    函数名的本质是放在栈Stack中的地址,指向堆中放置的对象。

    以上,思维比较发散,说得不对还望指出。
    2019-06-13
    3
  • 18646333118
    辛苦老师,希望能用更通俗的语言或者例子来帮助我们这帮菜鸟理解哈哈,有的时候感觉老师明白,但是编辑成文字总是差一点 哈
    2019-06-11
    3
  • xavier
    对于我这种野生程序员来说,收获颇多。每一篇都是从基础开始,然后循序渐进。感谢老师!
    2019-07-11
    2
  • KaitoShy
    怎么得上面的存储方式的?和hash存储有关么?还是python实现的造成的?
    2019-06-10
    1
  • 程序员人生
    想问一下Mr King,问题3我在pycharm中执行了一下没报错啊?
    2019-06-10
    1
  • Alery
    问题四的第二个问题,全局列表x之所以可以在函数中x.append是因为,x指向的列表不变,但是如果列表中的元素超过了列表预留的空间就会重新开启一个更大的列表x指向这个新的列表,这个时候x不也变了吗?为什么还能在函数中使用?
    2019-11-22
  • 追风筝的人
    Example 1:

    Input: 121
    Output: true
    Example 2:

    Input: -121
    Output: false
    Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
    class Solution:
        def isPalindrome(self, x: int) -> bool:
            if (x>=0):
                return x==int(str(x)[::-1])
            else :
                return False
                    
                        
                   
       老师 int(str(x)[::-1]) 这一行可以解释下具体意思吗 从后向前读取元素 最后要把string类型转为int类型 吗?
            
    2019-10-27
  • 追风筝的人
    class Solution:
        def isPalindrome(self, x: int) -> bool:
            return str(x) == str(x)[::-1]

    老师:str(x) == str(x)[::-1] 两个::是什么意思
    2019-10-27
    1
  • 隰有荷
    不太明白为什么新哈希表的结构是
    Indices
    None | index | None | None | index | None |

    Entries 这种形式?

    None和index的排列有什么规则吗?为什么会有None?
    2019-08-23
  • 静艺
    每节的配图都很有feel哈哈
    2019-08-11
  • 瞳梦
    list的append()并不是一个赋值操作,不会去定义新的变量。而是会根据LEGB规则去寻找list这个变量。
    2019-07-08
  • catshitfive
    有几个地方不是很懂请老师能否说明一下:
    (1)python中的list数据结构本质上是array,但是list多用来进行增删改的操作,岂不是没有链表结构时间复杂度低?还是说有什么优化?(2)list中存储的是指针(存储每个不可变元素对象的地址),我用id()查看了每个指针内存储的地址,发现是连续的,但是地址都相差32,如何理解32个这个数字,是32bytes? list除了存储的是指针,那么它的空间内还存储了指针指向的那些元素吗?(3)指针本身是一块内存,那么指针对应自己本身的地址如何知晓?
    2019-06-11
  • Geek_d848f7
    老师,原谅我还是不太理解这2点吧
       1. 列表分配大小时,遵循下面模式:0、4、8…,我看源代码的确这样,但是怎么算都对不上,求指导;
       2. 哈希的存储怎么知道是如图形式呢?尤其是无元素位置,这个位置为啥要分配呢?
    2019-06-10
  • 关于面向对象,看老师有没有机会讲下思路或技巧,我感觉我写面向对象还是有点带面向过程。
    2019-06-10
  • Hoo-Ah
    我理解的多态是同一种行为,不同的表现形式。
    2019-06-10
收起评论
19
返回
顶部