一、变量、对象、引用
变量:在Python里,不像别的一些语言,需要声明变量类型。因为在Python里变量没有类型。
变量创建:当第一次赋值给一个变量的时候,它就自动被创建了。
变量类型:在Python里变量没有类型
变量使用:当变量被表达式使用时马上被其引用的对象所取代。
当我们输入a=3时:
变量:一个系统表的元素,拥有指向对象的连接的空间
对象:分配的一块内存,有足够的空间去表示他们所代表的值
引用:自动形成的从变量到对象的指针
从之前的说明能看出,变量是存放指针的,因此变量没有类型。对象是存放数据的,所以对象有类型之说,因此如下操作在Python里是完全允许的。
在这里,a分别赋值为整数,字符串,浮点数。但其实,在Python里是各自创建了整数3,字符串Three以及浮点数3.14,a只是更改了引用这些对象的指针。对象是知道自己的类型的。在对象存储的头部信息里,有着指向整数类型(int)的指针。下面看一下之前操作在Python里是如何进行的。
对象回收♻ :因为对象是独立于变量的,当不再使用的时候是得回收的。
第二次引用(赋值)后,当没有别的变量引用对象3的话,3就会回收。以此类推。
二、共享引用
在Python里两个变量可以共享一个对象,这个叫做共享引用。比如:
这个时候a跟b是共享对象3的。
当a赋另一个值了,就会新创建一个对象,a变量会引用新对象,而不是改变对象。
在a跟b都是3的时候,如下语句也不会改变b的值,也是会创建新对象,a再去引用新的对象。
列表的共享引用:
这个时候,因为更改的是对象里的元素,所以List2引用的对象也是包含24,2,3三个元素的列表。
当有些时候你需要复制列表,而不是共享,如下方法可以帮助你。
这个时候List2指向的对象里的三个元素还是1,2,3。
三、共享引用与相等
之前讲过判断两给变量相等的判断语句:== 表示测试两个值是否相等,is 表示两个值是否是同一对象。
在Python里多个变量引用同一整数,字符串的时候,会引用同一对象,所以上面的a==b和a is b的结果都会是True。
所以上面的结果,两个也都是True。
但是其他时候,在Python里给两个变量赋予同样值的对象,其对象不是共用的。
在这里发现a is b会是False。
这样的话a is b肯定是True。
需要了解一个对象被引用多少次,可以使用如下函数来查看:
这个结果会让你比较惊讶,其数值比较大是因为在很多内部函数里会使用值为1的对象。getrefcount的结果不是0的原因:因为这个函数,当你使用的时候就调用其本身,所以最终结果不可能为0。
最后大家可以思考一下下面表达式中a的值会是什么。
领取专属 10元无门槛券
私享最新 技术干货