|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Python中的可变对象和不可变对象
今天在翻译 Requests 文档 的时候发现这两个概念性词汇,怕你们看了懵逼,所以这里大概说明一下。
Python 在堆里面分配的对象分为两类:可变对象和不可变对象。
就我们熟知的类型来说,dict 和 list 属于可变对象,int、float、str 和 tuple 则属于可变对象。
那么这个“可变”和“不可变”指的是什么东西?
可变对象
可变对象是指那些允许其引用的内容发生变化的对象,举个栗子:
- >>> list1 = [1, 2, 3, 4, 5]
- >>> list2 = list1
- >>> print("list1's id is " + str(id(list1)))
- list1's id is 2473635711816
- >>> print("list2's id is " + str(id(list2)))
- list2's id is 2473635711816
复制代码
上面例子中,list1 和 list2 共同引用 id 为 2473635711816 的内容,如果此时我们对 list1 引用的内容进行修改:
可以发现,list2 引用的内容也自动被改变了:
- >>> list2
- [1, 2, 3, 4, 5, 6]
复制代码
此时,list1 和 list2 仍然是引用同一块数据:
- >>> print("list1's id is " + str(id(list1)))
- list1's id is 2473635711816
- >>> print("list2's id is " + str(id(list2)))
- list2's id is 2473635711816
复制代码
这就是允许其引用的内容发生变化的对象。
不可变对象
相反,不可变对象是指那些不允许其引用的内容发生变化的对象,举个栗子:
- >>> i = 520
- >>> j = i
- >>> print("i's id is " + str(id(i)))
- i's id is 2473635778672
- >>> print("j's id is " + str(id(j)))
- j's id is 2473635778672
- >>> i is j
- True
复制代码
上面例子中,i 和 j 共同引用 id 为 2473635778672 的内容,如果此时我们对 i 引用的内容进行修改:
可以发现,j 引用的内容并不会跟着改变:
此时,i 和 j 已经不再共享同一块数据了:
- >>> print("i's id is " + str(id(i)))
- i's id is 1527894416
- >>> print("j's id is " + str(id(j)))
- j's id is 2473635778672
复制代码
这是因为 int 是不可变对象,所以当对 i 进行修改时,发现同一个位置还有其他变量的引用,于是将 i 拷贝到一个新的位置再进行修改。
|
评分
-
查看全部评分
|