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