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

  

posted @ 2022-03-13 03:02  zed99  阅读(66)  评论(0编辑  收藏  举报