mirror of
https://github.com/apachecn/ailearning.git
synced 2026-02-09 21:36:27 +08:00
182 lines
2.0 KiB
Markdown
182 lines
2.0 KiB
Markdown
# 可变和不可变类型
|
||
|
||
## 列表是可变的(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)
|
||
<ipython-input-6-83b06971f05e> in <module>()
|
||
----> 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中是不可变的。 |