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()才是浅赋值

 

posted on 2022-08-25 20:14  mitudesk  阅读(64)  评论(0)    收藏  举报