# 可变和不可变类型 ## 列表是可变的(Mutable) In [1]: ```py a = [1,2,3,4] a ``` Out[1]: ```py [1, 2, 3, 4] ``` 通过索引改变: In [2]: ```py a[0] = 100 a ``` Out[2]: ```py [100, 2, 3, 4] ``` 通过方法改变: In [3]: ```py a.insert(3, 200) a ``` Out[3]: ```py [100, 2, 3, 200, 4] ``` In [4]: ```py a.sort() a ``` Out[4]: ```py [2, 3, 4, 100, 200] ``` ## 字符串是不可变的(Immutable) In [5]: ```py s = "hello world" s ``` Out[5]: ```py 'hello world' ``` 通过索引改变会报错: In [6]: ```py s[0] = 'z' ``` ```py --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 s[0] = 'z' TypeError: 'str' object does not support item assignment ``` 字符串方法只是返回一个新字符串,并不改变原来的值: In [7]: ```py print s.replace('world', 'Mars') print s ``` ```py hello Mars hello world ``` 如果想改变字符串的值,可以用重新赋值的方法: In [8]: ```py s = "hello world" s = s.replace('world', 'Mars') print s ``` ```py hello Mars ``` 或者用 `bytearray` 代替字符串: In [9]: ```py s = bytearray('abcde') s[1:3] = '12' s ``` Out[9]: ```py bytearray(b'a12de') ``` 数据类型分类: | 可变数据类型 | 不可变数据类型 | | --- | --- | | `list`, `dictionary`, `set`, `numpy array`, `user defined objects` | `integer`, `float`, `long`, `complex`, `string`, `tuple`, `frozenset` | ## 字符串不可变的原因 其一,列表可以通过以下的方法改变,而字符串不支持这样的变化。 In [10]: ```py a = [1, 2, 3, 4] b = a ``` 此时, `a` 和 `b` 指向同一块区域,改变 `b` 的值, `a` 也会同时改变: In [11]: ```py b[0] = 100 a ``` Out[11]: ```py [100, 2, 3, 4] ``` 其二,是字符串与整数浮点数一样被认为是基本类型,而基本类型在Python中是不可变的。