在Python中,有一段特殊的整数,它们经常在python中被使用到,为了防止重复创建导致内存的增加,在python启动时,事先已经创建好了这些对象,放入到小整数对象池中,供开发者使用。当给变量赋值-5到256之间的数值时,其本质是对小整数对象池中对象的引用。
#创建两个变量,都是256(在小整数对象池中),可以看到a,b两个变量的id是一样的,赋值的过程即是对对象256内存id的引用过程
a = 256
b = 256
print(id(a),id(b))
1965754272 1965754272
#当给变量赋值不在小整数对象池中的数字(257)时,可以看到a,b的id是不一样的,此时赋值的过程即是对象创建的过程
#a先申请一个内存id,创建257对象;之后b再申请一个内存,再创建一个257对象
a = 257
b = 257
print(id(a),id(b))
67005712 67006128
#同上,-5与256一样,在小整数对象池中,变量id也是一样的
a = -5
b = -5
print(id(a),id(b))
1965750096 1965750096
#同上,-6与257不在小整数对象池中,变量id不一样
a = -6
b = -6
print(id(a),id(b))
67006208 67006176
在进行赋值操作时,我们会发现当给不同的变量赋值同样的数据时,代码写成一行与多行的效果是不一样的,如下:
#分别给变量a,b赋值1000,打印id可以看到两个内存地址是不一样的,写成多行,是创建了多个对象。
a = 1000
b = 1000
print(id(a),id(b))
67005872 67005712
#当将代码写成一行是,我们会发现变量a,b的内存id是一样的,说明只创建了一个对象
#当对变量进行赋值时,如果写成一行,python会自动识别需要创建几个对象,之后将变量指向相应对象的内存id,这样会减少对象的重复创建以及占用内存。
a,b = 1000,1000
print(id(a),id(b))
67006208 67006208
#同理:
a = (1,2,3)
b = (1,2,3)
print(id(a),id(b))
67960328 67988456
a,b = (1,2,3),(1,2,3)
print(id(a),id(b))
67960456 67960456