python可变对象和不可变对象
1. 概念: 区别在于对象中的元素是否可变
python内置的一些类型中
- 可变对象: list dict set
- 不可变对象: tuple string int float bool
# 可变对象
>>> a = [1, 2, 3]
>>> a[1] = 4
>>> a
[1, 4, 3]
# 不可变对象
>>> b = (1, 2, 3)
>>> b[1] = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
可变对象是可以直接被改变的,不可变对象则不行。
2.从地址角度理解
2.1 可变对象
>>> a = [1, 2, 3]
>>> id(a)
2139167246856
>>> b = a
>>> id(b)
2139167246856
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]
>>> id(a)
2139167246856
>>> id(b)
2139167246856 #可以看到a的元素变化后 b的元素同样发生变化 。其指向同一个地址。
2.2 不可变对象
>>> a = (1, 2, 3)
>>> id(a)
2139167074776
>>> b = a
>>> a = (4, 5, 6)
>>> a
(4, 5, 6)
>>> b
(1, 2, 3)
>>> id(a)
2139167075928
>>> id(b)
2139167074776 #可以看到改变a之后,a的地址发生了改变,而b的地址和元素均不改变。
3.在函数中的表现
1.可变对象
>>> def myfunc(g):
... g.append(1)
... print(l)
...
>>> g = [1, 2, 3]
>>> myfunc(g)
[1, 2, 3, 1]
>>> g
[1, 2, 3, 1] #这里可以看到可变对象在函数中被调用之后,会影响到全局中的这个变量值。
2.不可变对象
>>> def myfunc(a):
... a += 1
... print(a)
...
>>> a = 2
>>> myfunc(a)
3
>>> a #对于不可变对象,虽然函数中a值变化了,但是全局中a值没有发生变化,因为函数中的a值已经对应了另外一个地址,而全局中a地址没有变化。
2