Python 可变对象 & 不可变对象
Python 可变对象 & 不可变对象
不可变对象
Python 中不可变对象包括 int, string, float, tuple
不可变对象就是值不可变,但是其中一些看起来是可以变化的,比如:
a = 0
print(a, id(a))
a += 1
print(a, id(a))
输出结果:
0 4565339072
1 4565339104
由于 Python 变量中存储的都是引用,所以看似 a 的值从 0 变成了 1,但是其实只是 a 指向的对象从 0 变成了 1,并不是 0 变成了 1,通过 id()
可以看出在变化前后 a 指向的对象并不相同
特点
- 不可变对象可以作为字典的 key
a = {('a', 1): 'a'}
- 不可变对象没有
.copy()
方法,直接使用=
进行复制
a = 1
b = a
a += 1
print(a, b)
输出结果:
2, 1
可变对象
python 中可变对象包括 list, dict, set
可变对象的值可以直接进行修改:
a = []
print(a, id(a))
a.append(1)
print(a, id(a))
输出结果
[] 140279066188672
[1] 140279066188672
可以看到虽然 a 发生了变化,但是他的内存地址并没有改变,说明只是对象的值发生了改变
特点
- 可变对象不能作为字典的 key
a = {['a', 1]: 'a'}
报错
TypeError: unhashable type: 'list'
- 可变对象有
copy()
方法,通过该方法可以实现浅 copy,复制到的是可变对象中所有对象的内存地址
也就是如果可变对象里面嵌套着可变对象,则复制出的内层可变对象和复制前内层可变对象是同一个对象
a = [1, 2, 3, [1, 2]]
b = a.copy()
print(' a: ', a, '\n', 'b: ', b, '\n')
a.append(4)
print(' a: ', a, '\n', 'b: ', b, '\n')
a[3].append(3)
print(' a: ', a, '\n', 'b: ', b, '\n')
输出结果:
a: [1, 2, 3, [1, 2]]
b: [1, 2, 3, [1, 2]]
a: [1, 2, 3, [1, 2], 4]
b: [1, 2, 3, [1, 2]]
a: [1, 2, 3, [1, 2, 3], 4]
b: [1, 2, 3, [1, 2, 3]]
可以看出当 a 修改外层可变对象时,b 不会发生改变
当 a 修改内层可变对象时,b 中的内层可变对象也会跟着改变