问答文章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

我来回答

5个回答

懂视网 时间: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

①python中,万物皆对象。
②python中,没有绝对常量,有的是对常量的引用。
③python中,可变对象,表示的是对象内容可以改变,比如list ,dist
④python中,不可变对象,表示的是对象内容不可以改变,如字符串,tuple等
变量和对象,这两个很难解释,我个人理解是,比如在python中 i = 1,i是一个变量,也同时是一个对象,在python中, 变量和对象的区别不大,请看第①条。

如同 str = "Hello", str是变量(也是对象),而"Hello"就是常量了,str变量指向"Hello"。

所说的字符串重新赋值,只不过是创建了新的字符串,让变量指向这个新的地址罢了。

热心网友 时间:2022-04-06 09:43

If an object’s value can be modified, the object is said to be mutable. If the value cannot be modified, the object is said to be immutable.

就是说,对象的值如果可以修改,就称为可变对象,反之称为不可变对象

热心网友 时间:2022-04-06 11:18

a=(1,2,3)
a[0]=2   #error 是不可变对象

热心网友 时间:2022-04-06 13:09

python里没有不变对象吧。不记得有这么个东东。所有的东西都是对象,也都是变量。 几乎所有的东西都可以改。

打个比喻,几乎所有的东西都是指针。类,模块,函数,变量,甚至程序本身都是可以变的。追问谢谢上面的回答,明白了对象与变量之间的关系。
还想继续问问下面这段话里的意思:
在python精要参考(第二版)的P18页里有句话:某些对象的值是可变的,这些对象就被称为可变对象(mutable),另一些对象的值是不可变的,那就被称为不变对象(immutable)
不明白什么情况下就不可变了?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
冠状病毒酒精消毒怎么使用 袁咏仪主演的真爱之百万新娘哪个网站可以看 ...方便的话告诉我结局怎么样。陈玉是不是死了 冉冉东升可以组什么句子 求我姓冉的专属句子 弹弹堂高手之路全部过完给多少强化石 百度弹弹堂2里面的《高手之路高级高抛打法(高级)》《高手之路高级高差训 ... 弹弹堂工厂3怎么打 弹弹堂高手之路的任务怎么触发的 腹肌练习计划 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相对路径改成绝对路径 [php]相对路径和绝对路径 ../ ../../ ./ / 还有不写, 这几种都是哪些路径啊,有点晕 如何把抓取网页的相对路径变成绝对路径,比如抓取的网页内容中的链接是a/2/image/2.html, 搭建本地服务器,包含外部网页,对方源码都是相对路径,如何变成绝对路径! 不然我访问到的内容路径不对! php批量把一个file_get_contents的内容中的所有相对路径替换为绝对路径 html文件中如何把相对路径转成绝对路径 python中可变对象和不可变对象的理解,假如x为全局变量,当x为int即不可变对象时, 软件测试中,python可变数据类型和不可变数据类型? python中的可变数据类型和不可变数据类型的区别 python 可变不可变类型 新手,一个关于python可变与不可变对象的问题 自动化测试时需要使用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