1.
原型链本质是双向链表,保存在堆上
而变量(var)保存在栈上,通过一个字典联系,这个可以用字典locals()(无前缀)来查看,甚至打断
而之所以设置成双向链表也是为了方便查找
2.三种不同的保存模式,1,‘1’,[1]
通过sys.getrefcount(p),我们可以得知python存在一个常量池的机制
对于某些字符和数字有常量池存在,因此在调用时就会有一堆引用
而对于其他的,则会采取internal的机制,先创建一个在池子中,之后再索引,至于范围有多大完全看编译器是怎么实现的
对于list类型的[1]就更简单了,直接不一样
值得注意的是,list是可变对象,上面几个是不可变,另外,元组是不可变对象但没有实现这个机制,可能是因为考虑到没那么常用
另外变量和不变量赋值的方法是不一样的,譬如
a=1
b=a
b=2
只会让b再绑定一个,不会改变a的值
而
a=[1]
b=a
b[0]=99
会改变a[0]的值
但是如果再让整体赋值的话则会不一样,如
a=[1]
b=a
b=[99]
这时b会解绑
这种事的本质原因是=是深度赋值,会绑定地址,而.copy()才是浅赋值
浙公网安备 33010602011771号