#1 python底层是C来实现的。
#2 python一切皆对象(不管你是变量、类、函数等)
#3 整数为何不会溢出?
python在底层是通过C的32位整型数组来存储自身的整型对象的,通过32位整型数组合起来,以支持存储更大的数值,所以整型越大,就需要越多的32位整数。32位整数是4个字节,所以会4个字节的增长。
#4 浮点数的内存大小是不变的
因为python的浮点数的值在C中是通过一个double来维护的,而C中的值得类型一旦确定,大小就不变了。
所以范围是有限的,当浮点数不断增大,会牺牲精度来进行存储。
#5 对于字符串,是可变对象,长度不同大小不同
但是空字符串是站49个字节的,这49个字节是用来维护其他成员信息的;底层结构体除了维护具体的值之外,还要维护其他信息(比如引用计数)
#6 变量只是一个名字
python的变量是一个指针,当传递一个变量的时候,传递的是指针;但是在操作一个变量的时候,会操作一个变量指向的内存。
id(a)获取的不是a的地址,而是a指向内存的地址。
#7 变量类型
先创建变量,必须先赋值;创建相应的值后,这个值呢在C中对于一个结构体,结构体里面有一个成员专门用来存储该值对应的类型,让这个变量指向它。
python先有值再有变量。
对象
变量a在不同的情况下,会表现出不同的行为,这正是Python多态的核心。
python为什么慢?
有相当一部分时间浪费在类型和属性查找方面。
对象的创建
-
通过“ Python/C API的方式”创建
-
通过“ 类型对象去创建的”
相比而言,第二种效率更低,开销更大。【会进行参数解析、类型检测、创建、销毁】
我们说type是所有类型对象的元类,但是只有面对我们自定义的类的时候,type具有增删改的能力;
对于内置的类type是不可以对其动态增加、删除或者修改的,它们都是PyTypeObject对象,
对象的行为
根据支持的操作不同,Python中可以将对象进行以下分类:
-
数值型操作
-
序列型操作
-
映射型操作
而这三种操作,PyTypeObject中分别定义了三个指针,每个指针指向一个结构体实例,这个结构体实例中有大量的成员,成员也是函数指针,指向了具体函数。
引用计数
探讨类型对象的引用计数是没有太大意义的,而且内置类型对象是超越了引用计数规则的,没必要关注,重心是在实例对象上。
对于字典来说,遍历可以用items()方法同时检索键和相应的值;
对与序列来说,遍历可以用enumerate()方法同时检索索引和值;
要同时循环两个或多个序列,可以将条目与zip()函数配对。
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
print('What is your {0}?
It is {1}.'.format(q, a))