鱼C论坛

 找回密码
 立即注册
查看: 3377|回复: 33

[已解决]id居然不等!!!!》》》

[复制链接]
发表于 2021-11-6 19:23:58 | 显示全部楼层 |阅读模式
6鱼币
a = [1,23,3]
# b = [1,23,3]
b = a 
id(a) == id(b)

这个id是相等的我知道,结果为Ture

但是!!!!
a = [1,23,3]
b = [1,23,3]

id(a) == id(b)

这个id居然是不等的啊 !!!???我感觉自己内存地址的内容白学了
最佳答案
2021-11-6 19:23:59
因为在Python的内部,a和b是两个完全不同的变量,值相等并不意味着id相等

详细讲解:
在Python的内部有一个类似于一个储存器的东西
你在定义和赋值变量a的时候,Python为这个变量专门开辟一段空间为存储变量a

第一段代码的底层步骤其实是将变量b的指向变量a的地址。所以,当你改变变量a的值的时候,变量b的值也会改变;在改变变量b的值的时候,变量a的值也会改变。因为在底层,它们都指向同一个地址,只不过名字不同罢了。你可以把他们当作是一体的,不是两个独立的变量

而第二段代码,他们是两个两个独立的变量,他们两个指向的内存地址都是不同的,所以它们互不影响。Python为它们两个开辟了不同的两个空间

最佳答案

查看完整内容

因为在Python的内部,a和b是两个完全不同的变量,值相等并不意味着id相等 详细讲解: 在Python的内部有一个类似于一个储存器的东西 你在定义和赋值变量a的时候,Python为这个变量专门开辟一段空间为存储变量a 第一段代码的底层步骤其实是将变量b的指向变量a的地址。所以,当你改变变量a的值的时候,变量b的值也会改变;在改变变量b的值的时候,变量a的值也会改变。因为在底层,它们都指向同一个地址,只不过名字不同罢了。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 19:23:59 | 显示全部楼层    本楼为最佳答案   
因为在Python的内部,a和b是两个完全不同的变量,值相等并不意味着id相等

详细讲解:
在Python的内部有一个类似于一个储存器的东西
你在定义和赋值变量a的时候,Python为这个变量专门开辟一段空间为存储变量a

第一段代码的底层步骤其实是将变量b的指向变量a的地址。所以,当你改变变量a的值的时候,变量b的值也会改变;在改变变量b的值的时候,变量a的值也会改变。因为在底层,它们都指向同一个地址,只不过名字不同罢了。你可以把他们当作是一体的,不是两个独立的变量

而第二段代码,他们是两个两个独立的变量,他们两个指向的内存地址都是不同的,所以它们互不影响。Python为它们两个开辟了不同的两个空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 19:34:50 From FishC Mobile | 显示全部楼层
本帖最后由 hrpzcf 于 2021-11-6 19:38 编辑

第二个为什么要相同?两个不同的实例,id肯定不相同(除了一些Python优化过的实例)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 19:46:07 | 显示全部楼层
id() 用于获取对象的内存地址,明显 a 和 b 不同内存地址(只是值相同而已)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 19:51:18 | 显示全部楼层
我的钱包里有100元,我朋友钱包也有100,所以朋友的钱就是我的钱,成功解锁财富密码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 20:01:33 | 显示全部楼层
suchocolate 发表于 2021-11-6 19:51
我的钱包里有100元,我朋友钱包也有100,所以朋友的钱就是我的钱,成功解锁财富密码。

这句话,真的强啊,简而易懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 20:13:45 | 显示全部楼层
hash相等 id才能相等

元组和字符串数字都能hash
列表可以hash吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 20:35:20 | 显示全部楼层
每个对象都有一个自己的身份(Identity),而 hash 值如同对象的另外一个身份,但不是所有对象都有 hash 值。相同 hash 值,意味着相同身份(Identity),也相同值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 21:08:09 | 显示全部楼层
suchocolate 发表于 2021-11-6 19:51
我的钱包里有100元,我朋友钱包也有100,所以朋友的钱就是我的钱,成功解锁财富密码。

为什么不是1亿??

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

使用道具 举报

发表于 2021-11-6 22:14:52 | 显示全部楼层
嘉岳呀 发表于 2021-11-6 21:08
为什么不是1亿??

[doge]

我暂时没有那么多钱,等我慢慢找到越来越有钱的朋友的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 06:15:01 | 显示全部楼层
Python中每个值都有自己唯一的ID,不可能重复,除非:
a = 2,3,4
b = a
此时它们对应的才是同一个值:2,3,4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 09:19:36 | 显示全部楼层
Robot_Steve 发表于 2021-11-7 09:12
因为在Python的内部,a和b是两个完全不同的变量,值相等并不意味着id相等

详细讲解:

那么如你所说,请问

a = (1, 2, 3)
b = (1, 2, 3)

这俩者是不是储存在不同地方呢?Python 会专门开辟一段空间为储存这两个变量吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 09:23:32 | 显示全部楼层
傻眼貓咪 发表于 2021-11-7 09:19
那么如你所说,请问

a = (1, 2, 3)

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

使用道具 举报

发表于 2021-11-7 09:38:32 | 显示全部楼层
suchocolate 发表于 2021-11-6 22:14
我暂时没有那么多钱,等我慢慢找到越来越有钱的朋友的。

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

使用道具 举报

发表于 2021-11-7 10:06:15 | 显示全部楼层

错,答案是不会,a 和 b 储存在同样地址,如:
a = (1, 2, 3)
b = (1, 2, 3)

if a is b:
    print("a is b")
    print(id(a), id(b))
else:
    print("a not b")
    print(id(a), id(b))
输出结果:
a is b
2435208255168 2435208255168
以上两者 id 相同,用 Python is 判断符 来判断,俩者皆为同个地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 10:07:38 | 显示全部楼层
Robot_Steve 发表于 2021-11-7 09:12
因为在Python的内部,a和b是两个完全不同的变量,值相等并不意味着id相等

详细讲解:

你的解说不错,但是只对一半,不是所有类型变量都会开辟新空间储存的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 11:04:06 | 显示全部楼层
傻眼貓咪 发表于 2021-11-7 10:06
错,答案是不会,a 和 b 储存在同样地址,如:输出结果:以上两者 id 相同,用 Python is 判断符 来判断 ...
>>> a = (1, 2, 3)
>>> b = (1, 2, 3)
>>> a is b
False
>>> print(id(a), id(b))
483860010560 483859711616
>>> 
事实上并不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 11:18:25 | 显示全部楼层

你这是在 Python IDLE 上执行(也就是 tkinterGUI 为基础)其内存位置不一样吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 11:21:06 | 显示全部楼层

你可以试试先将代码储存为 py,再试试用 Python IDLE 打开执行 run 看看,你就明白我说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 11:24:25 | 显示全部楼层
傻眼貓咪 发表于 2021-11-7 10:06
错,答案是不会,a 和 b 储存在同样地址,如:输出结果:以上两者 id 相同,用 Python is 判断符 来判断 ...

谢谢了,结果更离谱了...
在Shell里运行和运行文件的结果完全相反
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 18:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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