鱼C论坛

 找回密码
 立即注册
查看: 2706|回复: 4

[已解决]Python把列表赋值给变量,列表修改时为啥列表和变量的id不一样?

[复制链接]
发表于 2021-5-30 16:47:15 | 显示全部楼层 |阅读模式
10鱼币
把列表赋值给变量,列表修改部分值时,变量的id不变(我理解这里列表应该是列表是可变对象) ,但是列表修改前、后的id是一样的,且和变量不一致,这里不懂啥原因。

>>> l1 = [1,2,3,4]
>>> id(l1)
46789312
>>> l1.append(5)
>>> l1
[1, 2, 3, 4, 5]
>>> id(l1)
46789312
>>> l1[2] = 'py'
>>> l1
[1, 2, 'py', 4, 5]
>>> id(l1)
46789312      #列表修改后,l1变量id始终没变

>>> id([1, 2, 'py', 4, 5])
47227968     #修改后的列表
>>> id([1,2,3,4])
47227968    #修改前的列表和修改后的列表id一致,却和变量l1不一致了,这里晕了

最佳答案
2021-5-30 16:47:16
dong811019 发表于 2021-5-30 17:03
>>> b = [2,3,4]
>>> id([2,3,4])
47226432  #大佬,为啥我这个有赋值的列表,id和变量b的也不一致?


不可变类型数据,因为不可改变所以就算内存一致也不影响实际情况,并且可以节约内存

但可变类型数据不同,若 id 一致,你只要一改变就会导致指向此 id 的所有数据一同发生改变

而你这里 b = [2,3,4] 是直接赋值给了 b ,而 id([2,3,4]) 是临时创建,且列表是可变元素,所以不会出现 id 相同

最佳答案

查看完整内容

不可变类型数据,因为不可改变所以就算内存一致也不影响实际情况,并且可以节约内存 但可变类型数据不同,若 id 一致,你只要一改变就会导致指向此 id 的所有数据一同发生改变 而你这里 b = [2,3,4] 是直接赋值给了 b ,而 id([2,3,4]) 是临时创建,且列表是可变元素,所以不会出现 id 相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-30 16:47:16 | 显示全部楼层    本楼为最佳答案   
dong811019 发表于 2021-5-30 17:03
>>> b = [2,3,4]
>>> id([2,3,4])
47226432  #大佬,为啥我这个有赋值的列表,id和变量b的也不一致?


不可变类型数据,因为不可改变所以就算内存一致也不影响实际情况,并且可以节约内存

但可变类型数据不同,若 id 一致,你只要一改变就会导致指向此 id 的所有数据一同发生改变

而你这里 b = [2,3,4] 是直接赋值给了 b ,而 id([2,3,4]) 是临时创建,且列表是可变元素,所以不会出现 id 相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-30 16:52:39 | 显示全部楼层


列表是一个容器,你没改变列表本身,它的 id 始终不会发生改变

即你这里“修改”列表 只是往列表里增加元素,或者替换元素

举个生活中的例子:

你有一个钱包,你往里面放钱,又或者你从这个钱包中取钱,你始终都是在你自己这个钱包上进行操作的

难道你往里面放钱时,你的钱包从 七匹狼牌钱包 变成 LV牌钱包 的吗~?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-30 16:58:08 | 显示全部楼层
本帖最后由 Twilight6 于 2021-5-30 16:59 编辑


另外你代码最后:

>>> id([1, 2, 'py', 4, 5])
47227968     
>>> id([1,2,3,4])
47227968   


是相当于零时创建列表,一创建完就被内存销毁回收了,因为你没有给列表具体赋值

但是此时 id 虽然相同,但是本质上已经不是一个列表了,只是新创建的列表是前个被销毁列表有着相同的 id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-30 17:03:58 | 显示全部楼层
Twilight6 发表于 2021-5-30 16:58
另外你代码最后:

>>> b = [2,3,4]
>>> id([2,3,4])
47226432  #大佬,为啥我这个有赋值的列表,id和变量b的也不一致?
>>> id(b)
47228160

>>> c = 3
>>> id(c)
8791345207008
>>> id(3)
8791345207008  #不可变对象和变量id就是一致的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表