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 中的内层可变对象也会跟着改变

posted on 2021-03-01 17:18  doubtful  阅读(301)  评论(0编辑  收藏  举报

导航