python中 关联/绑定/引用的含义
在python中,变量只是一个名字,当中不保存任何数据、没有类型,只是指向到一个对象。
关联/绑定/引用都是只变量和一个对象的关联关系
在交互模式下查看变量的绑定关系:
python查看变量的绑定关系,需要我们用到help命令,具体写法为hlep('__main__'),我们在python交互模式下输入该命令。
>>>help('__main__')
Help on module __main__:
NAME
__main__
FILE
(built-in)
(END)
我们可以看到上述内容(linux下按Q退出),
然后将变量a与整数1关联、变量b与变量a关联、变量c与变量a与变量b之和关联
a=1
b=a
c=a+b
再次输入help('__main__'),
>>> help('__main__')
Help on module __main__:
NAME
__main__
DATA
a = 1
b = 1
c = 2
FILE
(built-in)
(END)
故,我们可以通过此种方式查看当前环境下我们的所有变量。
python中的自动化内存管理
解释这个概念前,先进行如下操作
a = 5
b = 6
a = a+b
请问,这段代码中,计算机内存中究竟发生了哪些事儿?
首先,a = 5 ,程序会在内存中创建一个为5的数据,然后再创建一个变量a,而后将a与5相关联,作为变量保存在内存中
通俗来说可以将对象看作河中的小船,把变量看作是岸边的木桩,通过关联变量的操作,将小船固定在岸边不至于飘走。
树桩上有标签,标签对应着对象,通过标签我们就可以直接使用对象中的数据了。
同理,b = 6,程序会在内存中创建一个为6的数据,而后与b相关联,作为变量保存在内存中
当定义a=a+b的时候等于先前关联的变量a与b先做运算得出结果11,最后再一次与变量a相关联,由于变量a本身存在,
所以重新关联此变量的关联对象。
实机运行的结果
>>> a=5
>>> b=6
>>> help('__main__')
Help on module __main__:
NAME
__main__
DATA
a = 5
b = 6
FILE
(built-in)
>>> a=a+b
>>> help('__main__')
Help on module __main__:
NAME
__main__
DATA
a = 11
b = 6
FILE
(built-in)
由此可见,python拥有内存自动管理机制,只要没有关联变量的数据,python会自动回收,释放计算机的内存,可以供计算机其他应用使用。
序列赋值的语法:
变量名1,变量名2,......变量名n = 对象名1,对象名2,......,对象名n
变量名1,变量名2,......变量名n = (对象名1,对象名2,......,对象名n)
变量名1,变量名2,......变量名n = [对象名1,对象名2,......,对象名n]
例如
x,y,z,a=10,1000*35,25//2,15**15
等于是通过序列赋值的方法对xyza四个变量分别赋值,其结果与
x=10
y=1000*35
z=25//2
a=15**15
相同,使用help('__main__')查询已经关联的变量后,我们可以发现:
Help on module __main__:
NAME
__main__
DATA
a = 437893890380859375
x = 10
y = 35000
z = 12
FILE
(built-in)
变量的交换绑定练习:
已知有两个变量:
a绑定10000
b绑定20000
问,在不创建任何新对象的情况下,如何让a和b交换关联的对象?
首先创建两个变量a和b,而后使用help('__main__')查看变量
a = 10000
b = 20000
使用help('__main__')
Help on module __main__:
NAME
__main__
DATA
a = 10000
b = 20000
FILE
(built-in)
然后根据python的内存自动管理机制,使用序列赋值重新定义a与b关联的对象
即
a,b=b,a
最后,使用help('__main__')查看变量关联的对象是否成功交换
Help on module __main__:
NAME
__main__
DATA
a = 20000
b = 10000
FILE
(built-in)
需要注意的是,这种方法只可以在python中实现。
在不限制创建变量的情况下,我们还可以通过经典的交换算法进行变量关联交换
即,
temp = 10000 #首先声明第三个变量temp,在内存中保存住10000的值
a = b #然后重新关联a=b
b = temp #最后关联b=temp
is/is not运算符
作用:
判断两个对象是否绑定同一对象,如果是同一对象返回True,否则返回False
is not与is作用相反
语法:
x is y
x is not y
例如:
创建一个is_or_isnot.py文件
x = y =10000
z = 10000
print(x is y)
print(x is not y)
print(x is z)
print(x is not z)
运行该文件后
tarena@tedu:~/study/souce_code$ python3 is_or_isnot.py
True
False
False #虽然x与z关联的对象数值相同,但这两个数字在内存当中互为毫不相干的两个独立对象,所以python返回Flase。
True
小整数对象池
CPython中整数-5到256永远存在于小整数池中,不会释放并可重复使用
示例
a = 5
b = 5
a is b 返回 True
说明
由于-5~256的所有整数永远储存在python的解释执行器之内,当变量赋值在这个范围之内的时候,python不会创建一个新的数字对象,而是会直接
从小整数对象池中直接调用,所以在示例情况中,可以解释为直接在当中提取5的对象,两个对象相同,所以返回True。
此现象同样适用于对象为计算结果在-5~256范围内的数学表达式,如
a = 1+3
b = 2+2
a is b 同样返回True.
id 函数
作用:
返回一个对象在内存中的地址,在未来的开发中,主要用于判断该变量的对象是否是None。
格式:
id(对象)
引用id函数的概念后,我们再来证明is/is not运算符返回结果的过程
在交互模式中创建4个变量
>>>a = 5
>>>b = 2+3
>>>c = 10000
>>>d = 5000+5000
使用help(__main__)查看这些变量
>>>help(__main__)
Help on module __main__:
NAME
__main__
DATA
a = 5
b = 5
c = 10000
d = 10000
FILE
(built-in)
使用id函数,查看内存地址
>>> id(a)
10919552
>>> id(b)
10919552
>>> id(c)
140633354719024
>>> id(d)
140633330369744
由于内存地址的不同,所以变量所关联的对象也就完全不同,但这种现象只限于交互模式。写在.py文件当中的变量
会提前优化好,如果相同对象重复命名变量,则python会通过引用计数的方式,对这个对象进行共用,从而达到节省内存的目的。
del 语句(delete的简写)
作用:
用于删除变量,同时删除与对象的关联关系。如果可能则释放对象
语法:
del 变量名
python的内存管理和引用计数
每个对象都会记录有几个变量引用自身,相同对象重复引用时,其数量+1,当引用的数量为0时,则对象被销毁,此种自动化内存管理叫做引用计数
复合赋值算术运算符
运算符 说明
y+=x 等同于 y=y+x
y-=x 等同于 y=y-x
y*=x 等同于 y=y*x
y/=x 等同于 y=y/x
y//=x 等同于 y=y//x
y%=x 等同于 y=y%x
y**=x 等同于 y=y**x
例如:
>>> y = 100
>>> y +=1
>>> y
101