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

至于更底层的原因,作者还不太知道,在这儿先填个坑,学成之后再解释。

原文地址:https://www.cnblogs.com/scyq/p/12001862.html

时间: 2024-10-01 02:04:59

Python魔法缓存,以数字开始的相关文章

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

1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法也可以认为是属性):分为两种: ① python自动产生的(魔法方法):一般形式为 __func__(),python会在对应的时机自动调用该函数: ② 人为自定义的方法:一般和普通函数没有区别,只是定义在了class中而已 3.方法与函数的区别: 方法可认为是函数的特殊情况: ① 方法定义在cla

Python之路【第14章】:Python之缓存 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之缓存 RabbitMQ.Redis.Memcache.SQLAlchemy 一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 1. Memcached安装和

Python魔法

一.什么是Python魔法 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式.声明式等).Python的多范式依赖于Python对象中的特殊方法(special method). 特殊方法名的前后各有两个下划线.特殊方法又被称为魔法方法(magic method).定义了许多Python语法和表达方式,正如我们在下面的例子中将要看到的.当对象中定义了特殊方

Python判断是否是数字(无法判断浮点数)(已解决)

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 1 def isNum2(value): 2 try: 3 x = int(value) 4 except TypeError: 5 return False 6

python 魔法方法,属性,迭代

9.2 构造方法 python 中也属于自己的构造函数和析构函数, class fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.a,self.b = self.b,self.a+self.b return self.a def __iter__(self): return self fib = fibs() for i in fib: if i>1000: print i break 其中的__init__

Python 魔法方法~~

网友写的python魔法方法详情 :详情 魔法方法 含义   基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用4. __ne

python魔法方法-比较相关

在python2.x的版本中,支持不同类型的比较,其比较原则如下: 内置类型: 1.同一类型: 1.1)数字类型:包含int.float.long.complex.bool(bool类型是int的子类,且True=1, False=0).就按照数字的大小进行比较,例如:   1.2)非数字类型:1.2.1)如果类型中定义了如__cmp__.__gt__等魔法方法,就按照其魔法方法的返回值进行比较,具体如何就是这篇文章接下来要讨论的内容.  1.2.2)如果没有定义上述的魔法方法,就按照 id 函

192.168.62.124python运维开发(十一)----python操作缓存memcache、redis

内容目录: 缓存 memcache redis memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装配置 #安装依赖包 yum install libeve

python魔法方法-属性转换和类的表示

类型转换魔法 类型转换魔法其实就是实现了str.int等工厂函数的结果,通常这些函数还有类型转换的功能,下面是一些相关的魔法方法: __int__(self) 转换成整型,对应int函数. __long__(self) 转换成长整型,对应long函数. __float__(self) 转换成浮点型,对应float函数. __complex__(self) 转换成 复数型,对应complex函数. __oct__(self) 转换成八进制,对应oct函数. __hex__(self) 转换成十六进