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魔法缓存,以数字开始的更多相关文章

  1. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  2. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  3. Python魔法 - MetaClass

    Python魔法 - MetaClass metaclass The class of a class. Class definitions create a class name, a class ...

  4. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  5. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  6. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

  7. 『Python基础-5』数字,运算,转换

    『Python基础-5』数字,运算,转换 目录 基本的数字类型 二进制,八进制,十六进制 数字类型间的转换 数字运算 1. 数字类型 Python 数字数据类型用于存储数学上的值,比如整数.浮点数.复 ...

  8. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  9. Python 工匠:使用数字与字符串的技巧学习笔记

    #Python 工匠:使用数字与字符串的技巧学习笔记#https://github.com/piglei/one-python-craftsman/blob/master/zh_CN/3-tips-o ...

随机推荐

  1. Flutter 日期时间DatePicker控件及国际化

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 DatePicker Flutter并没有DatePick ...

  2. 部署nginx后无法访问数据库,查看www-error.log日志报错Class 'mysqli' not found in /usr/local/nginx/html/mysql.php on line 2

    检查你的php-mysql包是否安装 [root@localhost nginx]# rpm -qa php-mysql 没有任何输出则没有安装,接下来用yum安装php-mysql yum -y i ...

  3. 【Python】2.11学习笔记 注释,print,input,数据类型,标识符

    前面学了好多内存什么的知识,没什么用(我有眼不识泰山233 吐槽一句,这课简直就是讲给完全的编程小白听得 就从语言开始写吧(其实好多已经看过了,再来一遍 话说我已经忘了\(Markdown\)怎么写了 ...

  4. textareaCenter 未完结 其实就是iview的textarea的从写一遍 需求是光标上下居中

    重点1: 一但赋值内容,光标会失去,导致光标到第一位 解决方法 设置一个状态位isChange,编辑的时候不进行watch更新,因为emit会自动改变外层的值,触发watch 解决方法2 找回上一次的 ...

  5. PDF顯示插件

    1. ie瀏覽器適用<object id="pdf_panel" class="pdf-panel" classid="clsid:CA8A97 ...

  6. Lambda表达式学习笔记

    Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...

  7. Leetcode_877. 石子游戏(区间dp)

    偶数堆石子,只能从首尾取,取多的赢. 每次操作会产生两个子状态,区间dp,记得先枚举长度. code class Solution { public: int dp[505][505]; bool s ...

  8. Python-时间戳、元组时间的格式、自定义时间格式之间的转换

    一.时间戳.元组时间的格式.自定义时间格式之间的转换 1.下面是三者之间的转换关系: 2.代码如下: import time import datetime print(time.time()) #获 ...

  9. Selenium系列(二) - 控制浏览器操作的详细解读

    如果你还不想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识 ...

  10. python基础知识6——函数

    函数:自定义函数:函数的参数:不带参数,普通参数,默认参数,动态参数:返回值return:函数作用域:内置函数高阶函数:map,reduce,filter,sorted:lambda表达式:文件操作: ...