在Python中主要有两种数据类型, 一种是可变数据类型, 另一种是不可变数据类型
- 不可变数据类型
数字型: int, float, complex, bool, long
字符型: str
元 祖: tuple
- 可变数据类型
列表: list
字典: dict
不可变数据类型
不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 存放这个值的内存空间就是内存中的一个地址, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内存地址, 通过这个地址, 变量就可以在内存中取出数据了. 所谓不可变就是说, 我们不能改变这个数据在内存中的值, 所以当我们改变这个变量的赋值时, 只是在内存中重新开辟了一块空间, 将这一条新的数据存放在这一个新的内存地址里, 而原来的那个变量就不在引用原数据的内存地址而转为引用新数据的内存地址了.
以上, 所有不可变类型的数据都是这样的引用方式, 包括函数中的形参, 实际上是引用的是实参的内存地址, 函数的返回值, 与其接收值都是一样的内存地址
可变数据类型
当你第一次声明了一个可变数据类型的时候, 同样会在内存中开辟一个空间, 并且将你所赋的数据值放在这块内存中, 然后将这个变量指向数据所在的内存地址, 不同的是, 可变数据类型可以对内存中的数据进行修改, 并且不会导致变量引用地址的变化, 但是这种修改仅限于Python中的内置方法, 比如list.append(), list.remove(), dict.pop(), dict.clear()等, 如果要是进行重新赋值的操作的话, 一样会改变变量的地址指向
此外, 有一个需要注意的地方就是, 对一个字典的key以及列表的项进行单独更改, 同样是不会改变字典变量或列表变量的内存地址指向的, 但是, 会改变对应的key以及数组项的内存地址, 因为key实质上也是一个变量, 当对它赋值的时候, 也会在内存中开辟一个空间存储其数据, key同样也只是储存着数据在内存中的地址.