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 可变对象

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> 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.可变对象

1
2
3
4
5
6
7
8
9
>>> def myfunc(g):
...     g.append(1)
...     print(l)
...
>>> g = [1, 2, 3]
>>> myfunc(g)
[1, 2, 3, 1]
>>> g
[1, 2, 3, 1] #这里可以看到可变对象在函数中被调用之后,会影响到全局中的这个变量值。

2.不可变对象

1
2
3
4
5
6
7
8
9
>>> def myfunc(a):
...     a += 1
...     print(a)
...
>>> a = 2
>>> myfunc(a)
3
>>> a #对于不可变对象,虽然函数中a值变化了,但是全局中a值没有发生变化,因为函数中的a值已经对应了另外一个地址,而全局中a地址没有变化。
2

  

posted @   zed99  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示