Python魔法缓存,以数字开始
Python魔法缓存,以数字开始
众所周知,Python是弱类型的脚本语言,变量的定义是不用声明类型的。
a = 1
Python所有数字的本质都是对象, 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 而变量名实际上创建了一个引用指向该数字。
我们可以用del语句删除该引用。
a = 1
print(a)
>>> 1
del a
print(a)
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
那么就有个问题,Python解释器如果每次都判断类型再创建引用,岂不是很慢?
所以Python缓存了[-5,256]范围内常用的整数 ,他们不会被垃圾回收机制回收。于是我们在Python Shell里输入如下代码,会产生神奇的现象。
>>> a = 1
>>> b = 1
>>> a == b
>>> True
>>> a is b
>>> True
>>> a = 1000
>>> b = 1000
>>> a == b
>>> True
>>> a is b
>>> False
所以期望该范围内的整数也是相同的,可以理解为两个变量创建了同一个引用。"=="比较的是二者的引用对象的内容。"is"比较的是两个引用对象的id,也就是比较两个对象是否为同一个实例化对象,是否指向同一个内存地址。
但是,如果把代码放入同一个文件。结果会大不相同。
a = 300
b = 300
print(a is b)
>>> True
简单理解,Python解释器会分析整个文件,做出如下举动:
Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。
那么哪些变量会有以上机制呢?
- int(float): 任何数字在同一代码块下都会复用。
- bool: True和False
- String: 几乎所有的字符串都会符合缓存机制
例如,
a = "a"
b = "a"
print(a is b)
>>> True
但是字典并不会
a = {1: 2}
b = {1: 2}
print(a is b)
>>> False
而Shell中只会一行一行的处理数据,所以无法达到文件的效果。但是如果我们在Shell里这么写。说明Python解释器在读取第一行的时候,分析了两个变量的值,并知道二者相等,所以引用到同一对象。
>>> a = 1000;b = 1000
>>> a is b
>>> True
至于更底层的原因,作者还不太知道,在这儿先填个坑,学成之后再解释。
Python魔法缓存,以数字开始的更多相关文章
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- 1. Python 魔法方法
Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...
- Python魔法 - MetaClass
Python魔法 - MetaClass metaclass The class of a class. Class definitions create a class name, a class ...
- python魔法方法:__getattr__,__setattr__,__getattribute__
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
- python魔法方法大全
1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...
- python魔法函数__dict__和__getattr__的妙用
python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...
- 『Python基础-5』数字,运算,转换
『Python基础-5』数字,运算,转换 目录 基本的数字类型 二进制,八进制,十六进制 数字类型间的转换 数字运算 1. 数字类型 Python 数字数据类型用于存储数学上的值,比如整数.浮点数.复 ...
- python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...
- Python 工匠:使用数字与字符串的技巧学习笔记
#Python 工匠:使用数字与字符串的技巧学习笔记#https://github.com/piglei/one-python-craftsman/blob/master/zh_CN/3-tips-o ...
随机推荐
- BeetleX.FastHttpApi之测试插件集成
说到Webapi测试工具相信很多人想起Swagger,它可以非常方便地集成到项目中并进行项目Webapi接口测试.而BeetleX.FastHttpApi在新版本中也提供类似的插件,只需要引用这个插件 ...
- C++ 删除字符串中的数字并重新按顺序排列
#include <stdio.h> #include <string.h> char* Find_str(char* p) { ; i < strlen(p); i++ ...
- 从零搭建Spring Cloud Gateway网关(一)
新建Spring Boot项目 怎么新建Spring Boot项目这里不再具体赘述,不会的可以翻看下之前的博客或者直接百度.这里直接贴出对应的pom文件. pom依赖如下: <?xml vers ...
- 人见人爱A-B 题解
参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算.(当然,大家都知道集合的定义,就是 ...
- 今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对
今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对 baseUrl: { // // dev: 'http://1 ...
- 两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走 (不加flex不自动撑开)
两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走
- 使用vue构建一个可视化大数据平台
使用vue全家桶以及v-charts和datav实现一个github可视化大数据界面展示,没有设计搞的原因,只能忽略设计编写一下界面, 用户只需要登录的时候填写自己github用户名.就可以看到数据展 ...
- oracle中表空间管理,游标
一.表空间 oracle使用表空间来管理数据库的对象(表,序列,过程,函数,游标等). oracle的逻辑结构(看不见的):oracle数据库 => 表空间 => 表 序列 过程等对象. ...
- PowerShell初探
Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows 7/Windows 2008 R2和更高版本),使命令行用户和脚本编写者可 ...
- DRF之restful规范、Postman接口测试
一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...