Update Python面试宝典-基础篇-2020.md

更新003题在不同版本python中出现的不同结果情况解释
pull/2/head
systemime 2020-10-23 10:14:17 +08:00 committed by GitHub
parent 4d5aae2fca
commit ea7c91b04e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 1 deletions

View File

@ -123,10 +123,24 @@ foo()
运行结果:
```
# python3.8
True True
True False
True
# python3.7
True False
True False
True
# python3.6
True True
True False
True
```
> python的内存模型是一个金字塔由底层c molloc创建分配内存在上层维护一个小数据池小数据池中包含常用短字符串[-5,256]数字,用户创建变量在小数据池中将直接指向这块内存地址,而在小数据池外的部分是用户创建的变量,这里要使用代码块来区分内存地址,在同一代码块中,相同的整型内存地址不变(性能优化考虑),以及复制(深/浅)时整型变量在使用改变内存地址仍然指向原来的地址本段代码中foo函数属于另一个代码块创建新的内存地址`print(e is f, e is d)`结果必然是`True False``print(g is a)`中g,a,b均是小数据池中数据内存地址相同
> 至于python3.7版本中`print(a is b, c is d)`输出`True False`的结果,可能是该版本优化问题,查询资料后会来补充
上面代码中`a is b`的结果是`True`但`c is d`的结果是`False`这一点的确让人费解。CPython解释器出于性能优化的考虑把频繁使用的整数对象用一个叫`small_ints`的对象池缓存起来造成的。`small_ints`缓存的整数值被设定为`[-5, 256]`这个区间,也就是说,在任何引用这些整数的地方,都不需要重新创建`int`对象,而是直接引用缓存池中的对象。如果整数不在该范围内,那么即便两个整数的值相同,它们也是不同的对象。