众所周知,Python中有很多种类型:
Number 数值类型
Str字符串类型
tuple元祖类型
List列表类型
Dictionary字典类型
Set集合
那么这些类型中,究竟哪些类型属于可变类型,哪些又属于不可变类型呢,接下来,让我们一起来看一看!!!
在这里先给大家推荐一个强大的网页编辑器: http://pythontutor.com/live.html#mode=edit,这个编辑可以清楚地推演出变量的变化过程,接下来让我们先来看看什么是可变类型!!!
可变类型
基础概念:可变数据类型是指变量所指向的内存地址处的值是可以被改变的,也就是说可变类型在赋值的时候copy的是地址或者引用.
属于可变类型的类型: List,Dictionary,Set.
1.List
![abc551654054753929e3e24c7edc9b7a.png](https://i-blog.csdnimg.cn/blog_migrate/5fe66703a424f5485b017a40625596ec.jpeg)
![fcc825bbd4f23c88a527347e4b8d2bad.png](https://i-blog.csdnimg.cn/blog_migrate/dc165d636c3d0283e80987a664147415.jpeg)
![3a7201386fef19f30770b64cb8451fe4.png](https://i-blog.csdnimg.cn/blog_migrate/a54ad64940297b0a9ee485590a425829.jpeg)
![1f1462df7374b351e6c00354fead170b.png](https://i-blog.csdnimg.cn/blog_migrate/1f53e49013d58fdaae5c4ff325b04902.jpeg)
3.Set
![2486edf4f63419d5eaf82e424b89a83a.png](https://i-blog.csdnimg.cn/blog_migrate/b9d4f1cf13a4c5c328cdab32a1d7ac84.jpeg)
![1c93301009fa476db46bbc730158d51b.png](https://i-blog.csdnimg.cn/blog_migrate/430e4740097efb5ed6323eba7a024784.jpeg)
注:以上类型值的改变都是基于内存地址的改变,改变的是内存地址的值.
不可变类型
概念:不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内存地址, 通过这个地址, 变量就可以在内存中取出数据了. 所谓不可变就是说, 我们不能改变这个数据在内存中的值, 所以当我们改变这个变量的赋值时, 只是在内存中重新开辟了一块空间, 将这一条新的数据存放在这一个新的内存地址里, 而原来的那个变量就不在引用原数据的内存地址而转为引用新数据的内存地址了,相当于改变了变量指向的内存地址.
属于不可变类型的类型: Number ,Str,tuple
1.Number
![9a65e1b4d0fa8edd038874fa3eb7d18a.png](https://i-blog.csdnimg.cn/blog_migrate/40e986acc2fce4a9dc294e8c4c1ed017.jpeg)
2.Str
![919f009c67b07673be3d527fc12dfb68.png](https://i-blog.csdnimg.cn/blog_migrate/c4ea3773eb1c17c58ccd7c53d645dba1.jpeg)
3.tuple
元组类型是一个比较特殊的类型,看下图:
当元组内不存在数组类型时,那么不可变.
![1ff5e81f93cef283f327c801284f0312.png](https://i-blog.csdnimg.cn/blog_migrate/9317a1f6db060f8b883b3c3850f60f0a.jpeg)
当元组内存在数组类型时,那么元组内数组是可变的.
![2e2656273849c6b3ece76f9df8037b33.png](https://i-blog.csdnimg.cn/blog_migrate/24fd4ecb6983aae513b6eae5b23d57ce.jpeg)
![3083ed4a05d9b03500614fa8a5fce2a6.png](https://i-blog.csdnimg.cn/blog_migrate/e7eb4b9f3ba2cc3513ec0c26981e7cc2.jpeg)
![9d3c2b9f5445044b42b67e3c46f64e2a.png](https://i-blog.csdnimg.cn/blog_migrate/03887fe5f04dde2a85427d7e81cd5f91.jpeg)
注:产生这种情况的原因是,元组的最后一个元素内存地址指向的或者说引用的是list,而我们更改值的时候更改的也只是list的内存地址的值,元组其余的元素还是不可变的.