python中的数据是用对象来进行表示的,对象间是通过引用来进行传递的。每个对象都有各自的编号、类型和值。一个对象被创建后,它的编号就绝不会改变;你可以将其理解为该对象在内存中的地址。对象的类型决定了对象所具有的操作,例如对于list类型的对象,可以进行迭代,而整型对象是不可以的。对于对象的值而言,有些对象的值是可以进行改变的,而有些对象的值是不可改变的,这在后面会进行介绍。

对于a = 10,创建一个整数对象,python完成的是这样的工作:

  1. 创建变量a
  2. 创建一个整型对象(分配一块内存)来存储10
  3. 将变量与对象通过指针连接起来,从变量到对象的连接称为引用(变量引用对象),将该引用与变量a关联起来,也就是a中存放的是10在内存中的地址,id(a)可以看作该地址,这是python对象的标识。此时a便可以称作整型对象的引用。

python 模型评估 python的模型_python 模型评估


而容器是包含对象的引用的对象,例如对于这样的一个list a = [1,2,3],该list对象(整体)的引用是a,但是该list容器中存放着对象1,2,3的引用,并不是存放着1,2,3这是需要注意的,让我们来验证一下:

>>> a = [1, 2, 3]
>>> id(a)
2530146482824
>>> id(a[0])
140732064571792
>>> id(1)
140732064571792
>>> id(a[1])
140732064571824
>>> id(2)
140732064571824
>>> id(a[3])
140732064571856
>>> id(3)
140732064571856
>>> id(a)
2530146482824

可以看出该list对象的id始终为2530146482824,也就是对象一旦创立其id是不变的,也可以看出这个list容器中存放着整数对象1,2,3的引用,不过list容器的值是[1,2,3],容器的值是指的容器中对象的值,而不是容器中包含的对象的引用。

上面有说过,有些对象的值是可以进行改变的,而有些对象的值是不可改变的,正式的定义一下可变对象与不可变对象:

不可变对象:值不可以修改的对象。(注意对于容器对象而言,此处的值是指的容器中的对象的引用,而非容器中的对象的值)
可变对象:值可以修改的对象。
注意此处有两个关键点,一是值是否可变、二是该对象的值,不是其他对象的值。为什么这么说呢,对于杠精的我,当写出了如下代码,这时可能就会说,值这不是改变了么,但是注意关键点:该对象的值,这是两个对象的值,一个是整数对象1的值,一个是整数对象2的值,另外a是指的对象的引用,此处也仅能说明a从整数对象1的引用变为了整数对象2的引用。

a = 1
a = 2

python中数字、字符串和元组是不可变对象,可变对象有list,dict等,下面主要对容器对象tuple和list进行验证:

对tuple进行验证如下,可以看出尽管tuple容器的值改变了,但是容器中的对象的引用并没有改变。但是对于容器而言,其包含的对象的引用是否改变作为其是否为可改变对象的依据,并不是其包含的对象的值,所以tuple容器是不可变对象。

>>> t = ('a', 'b', ['A', 'B'])
>>> id(t[2])
1915751584712
>>> t[2][0] = 'X'
>>> id(t[2])
1915751584712
>>>

对list进行验证如下,可以看出list容器中对象的引用改变了,所以list对象是可变对象。

>>> a = [1,2,3,4]
>>> id(a[0])
140731715920272
>>> a[0] = 2
>>> id(a[0])
140731715920304

因此对于不可变对象数字、字符串和元组,他们的值均不可修改(对于容器是指其对象的引用不可更改),而对于可变对象list,dict,他们包含的对象的引用是可以修改的。