问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

新手,一个关于python可变与不可变对象的问题

发布网友 发布时间:2022-04-06 06:56

我来回答

2个回答

懂视网 时间:2022-04-06 11:17

不可变对象

常见的不可变对象(immutable objects):

  1. Number: int, float, complex
  2. string
  3. tuple
  4. frozenset:set 的另外一种类型

让我们通过例子感受一下

例子

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True

这里创建了两个 int 对象,并且让 x,y 指向同一个对象,然后我们试着修改一下 x,让 x+1

>>>x=x+1

这个时候 x 的 id 值和 y 的 id 以及 1 的 id 还一样吗?

>>> x=x+1
>>> id(x)==id(y)
False
>>> id(x)==id(1)
False
>>> id(1)==id(y)
True

从结果不难看出来,x 所指向的对象已经改变了,但是 1 并没有改变。这就是不可变对象,对于不可变对象来说,一旦创建之后就不允许被改变。

注意: 不可变并不严格等同绝对的不可变

>>> a=([1],2,3)
>>> id(a)
4338862696
>>> id(a[0])
4338949128
>>> a[0][0]=0
>>> id(a)
4338862696
>>> id(a[0])
4338949128

从上面的例子不难看出,我们改变了 a[0] 的值,但是并没有影响它的 id 值。一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变;但是该容器仍属于不可变对象,因为它的 id 值不会改变的。

可变对象

常见的可变对象(mutable objects):

  1. list
  2. dict
  3. set

同样的通过例子感受一下

例子

>>> c = [1,2,3]
>>> b = c
>>> id(b)==id(c)
True

创建两个 list 对象,并且让 c,d 指向同一个对象,然后我们试着修改一下 c

c[0]=4

这个时候在看一下两个对象的 id 值是否一致

>>> id(c)==id(b)
True

修改之后,c,d 仍然指向同一个对象,所以不难得出结论,对于一个可变对象来说,修改 value 值并不会对它的 id 造成任何影响

函数参数

对于可变对象和不可变对象,他们两者在函数当作参数传递的时候表现也有所不同

例子

eg0

def update_list(nums_list):
 print(f'2 id:{id(nums_list)}')
 nums_list += [10]
 print(f'3 id:{id(nums_list)}')

 
number_list = [5, 6]
print(f'1:{number_list}, id:{id(number_list)}') 
update_list(number_list)
print(f'4:{number_list}, id:{id(number_list)}')

看一下结果

1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id:4457707912

在看另外一个例子

eg1

def add_num(number):
 print(f'2:{id(number)}')
 number += 1
 print(f'3:{id(number)}')


num = 1
print(f'1:{num}, id:{id(num)}') 
add_num(num)
print(f'4:{num}, id:{id(num)}')

看一下结果

1:1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416

有其他有些文章中,上面 eg0 被称为引用传递,eg1 被称为值传递。然而在官方文档中,并没有找到有关的这两个名词的任何内容,或者这种方式并不是上述的两者任意一种。

这里的重点是:对于可变对象,在函数中的值的改变,会导致对象改变;对于不可变对象,在函数中值的改变,对其不会造成任何影响

热心网友 时间:2022-04-06 08:25

所谓对象的可变与不可变,是看对象是否有hash值。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小红书怎么修改ID 专属ID更改方法 Win11如何更改字体视觉效果 Win11字体视觉效果修改方法介绍 华为团队管理模式 通信工程这个专业主要是学什么 专注力差的孩子该如何纠正 三岁的孩子专注力不好,怎么培养她的专注力呀!。 镇江关周围有什么玩的,镇江及周边旅游景点 大港南站去镇江汽车站怎么走 镇江汽车站到大港南站有多远 出国去澳大利亚留学都需要注意哪些事项呢? 澳大利亚留学条件及注意事项有哪些 python 可变不可变类型 python中的可变数据类型和不可变数据类型的区别 软件测试中,python可变数据类型和不可变数据类型? python中可变对象和不可变对象的理解,假如x为全局变量,当x为int即不可变对象时, 谁能给简单通俗点解释下python里可变对象、不变对象、变量三者的关系? Python 中的可变类型对象和不可变类型是什么意思? Douphp源码程序 怎么修改网站文章后缀 PHP后缀文件 如何下载后的文件把后缀php改为zip后解压 怎么修改后缀是.php网页下的内容文字? 后缀名为.php文件如何修改 htaccess如何自定义php后缀? 关于php删除数组的问题,如何删除数组?例如 $player = array( "player" PHP怎么删除整个数组? 如何把字符串最终转换为浮点数 PHP生成cookie并设置cookie 为晚上0点就失效 压缩包方式安装php时,php.ini如何修改; extension_dir php相对地址与绝对地址问题。 批处理相对路径怎么转换为绝对路径 dedecms5.7相对路径改成绝对路径 自动化测试时需要使用python,请问如何理解python中的可变和不可变数据类型 python可变不可变类型 python 不变对象和可变对象的问题! python中的immutable和mutable(不可变与可变)怎么理解? 关于Python中的不可变对象--字符串 请问可变对象和不可变对象的本质区别,如NSString和... 关于python的可变类型和不可变类型有个问题? python类的可变类型成员和不可变类型成员的区别 python中对象可不可以 Python的问题啊,小白没看懂 为什么Python有相同的不可变对象id不同 python如何读取Excel合并单元格的内容 python 怎么把excel文件单元格的格式和内容一起读取出来 python xlrd模块 怎么获得单元格格式信息 python xlrd 读取的单元格的值,怎么能确保是文本TEXT类型的,现在某些单元格读出来是NUMBER,有些是BOOL python 使用xlrd模块读取excel文件时,能否读取单元格的备注? python2.4的openpyxl1.1.5 xlrd0.7读取excel单元格格式 python怎么读取用别的单元格表示的数据 python中的unittest有什么作用 python unittest单元测试框架中,如何对一个testcase参数化,具体如何实现