在python中,每个对象都有各自的编号、类型和值。一个对象被创建后,在此对象的生命周期中编号保证是唯一且恒定的。你可以将其理解为该对象在内存中的地址。 'is' 运算符可以比较两个对象的编号是否相同;id() 函数能返回一个代表其编号的整型数。
下面变量a和变量b指向的对象以及对象[1]在内存中的地址都是不同的。尽管值相同,但它们是三个不同的对象。
下面的变量a指向的对象虽然值发生了改变,但在内存中的地址并没有变化,还是同一个对象。
在python中有些对象的值是可以改变的。值可以改变的对象被称为可变对象,如列表和字典;值不可以改变的对象就被称为不可变对象,如数字、字符串和元组。有些对象包含对其他对象的引用,它们被称为容器,如元组、列表和字典等。一个不可变容器对象,如果包含对可变对象的引用,如a=[1,2],元组b=(a,'aa',1),当a的值改变时,如a.append('3'),则元组b的值也会改变,但是该容器(元组b)仍属于不可变对象,因为它所包含的对象集是不会改变的。因此,不可变并不严格等同于值不能改变,上面容器的值指的是所包含对象的具体值而不是所包含对象的编号(内存地址),所以容器的值改变了。但是,当我们谈论一个容器的可变性时,我觉得仅指其直接包含的对象的编号个数是否可变。上面容器(元组b)包含的对象的编号有两个(编号本身是不会变的),不会新增或者减少编号,所以它是不可变的类型。