鱼C论坛

 找回密码
 立即注册
查看: 1889|回复: 16

id相关问题

[复制链接]
发表于 2022-3-17 18:12:08 | 显示全部楼层 |阅读模式
20鱼币
python中编辑器模式下,用256以上的数字或者中文汉字的字符串或者元组等不可变对象创建两个相同数据的变量,发现他们的id相同,但是在交互模式下他们的id不同,按道理来说,他们的id应该不同,为什么在编辑器下却相同呢?

a = '中国'
b = '中国'
print(id(b),id(a))

在编辑器下相同,在交互下不同

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

使用道具 举报

发表于 2022-3-17 18:17:18 | 显示全部楼层
你重新试试,两个 id 实际是一样的,
因为字符串是一个不可变类型的数据,所以 a 和 b 能都指向 "中国",
如果换成列表这类可变数据类型的数据,如:["中国"],id 便不会相等了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 18:19:44 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:17
你重新试试,两个 id 实际是一样的,
因为字符串是一个不可变类型的数据,所以 a 和 b 能都指向 "中国",
...

小甲鱼新课里的课后作业中讲过的,具体那一讲容我想想......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-17 18:20:56 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:17
你重新试试,两个 id 实际是一样的,
因为字符串是一个不可变类型的数据,所以 a 和 b 能都指向 "中国",
...

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

使用道具 举报

 楼主| 发表于 2022-3-17 18:21:35 | 显示全部楼层
这和小甲鱼的课关系不大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 18:22:52 | 显示全部楼层
1205768305 发表于 2022-3-17 18:21
这和小甲鱼的课关系不大

???你重新打开 IDLE 试一下,我是 True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-17 18:24:28 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:22
???你重新打开 IDLE 试一下,我是 True

如果是数字字母或者下划线的话,id确实应该相同,但是如果是汉字就不应该相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 18:28:42 | 显示全部楼层
1205768305 发表于 2022-3-17 18:24
如果是数字字母或者下划线的话,id确实应该相同,但是如果是汉字就不应该相同

不是应该相同吗?只要两个变量都同时赋值为同一个 字符串 ,
它们所对应的就肯定都是一个 id,因为它是字符串。
数字这类才需要管这些吧......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 18:30:48 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:28
不是应该相同吗?只要两个变量都同时赋值为同一个 字符串 ,
它们所对应的就肯定都是一个 id,因为它是 ...

重点它是字符串呀......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-17 18:37:27 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:30
重点它是字符串呀......

字符串比较特殊,内部做了缓存机制,当你创建了一个字符串时,如果再次创建一个相同的字符串时,会使用第一个已经创建的内存地址,并且只能是字母数字下划线,长度不能超过20
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-17 18:38:28 | 显示全部楼层
变成我回答你问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 18:39:01 | 显示全部楼层
1205768305 发表于 2022-3-17 18:37
字符串比较特殊,内部做了缓存机制,当你创建了一个字符串时,如果再次创建一个相同的字符串时,会使用第 ...


好吧......我没有学那没彻底......
小甲鱼说过吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-17 18:52:16 | 显示全部楼层
python爱好者. 发表于 2022-3-17 18:39
好吧......我没有学那没彻底......
小甲鱼说过吗?

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

使用道具 举报

发表于 2022-3-17 18:53:04 | 显示全部楼层

我还专门写了一大张纸呢,没有说过呀......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 23:39:57 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-3-17 23:45 编辑

其实呢,id()  返回的并不是 "真实的内存地址",只是多数时候可以相当于对象的"内存地址"。  你可以看看 print(id(a), id(b), a == b)  比较的结果是 True
要获取真实的内存地址,要用底层的 ctypes.addressof(c_obj) ,  如下:
>>> a = '中国'
>>> b = '中国'
>>> print(id(a), id(b), a == b)
2841032603472 2841028106352 True
>>> print(a==b, a is b)   # 比较的是"值";判断是否"相同",用的是 id() 
True False

# 查看真正的内存地址:
>>> from ctypes import c_wchar_p, addressof
>>> addressof( c_wchar_p(a) )
2841028157712
>>> addressof( c_wchar_p(b) )
2841028157712


# 但是呢,有趣的是:
>>> c_wchar_p(a) == c_wchar_p(b)
False
>>> c_wchar_p(a) is c_wchar_p(b)
False
>>> c_wchar_p(a).value
'中国'
>>> c_wchar_p(b).value
'中国'
>>> type(c_wchar_p(a))
<class 'ctypes.c_wchar_p'>
# 还想深入的话,就自己研究C语言吧, 我暂时到这先打注了   ^_ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 08:19:17 | 显示全部楼层
单纯的指向同一个对象啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 08:46:24 | 显示全部楼层
你这个问题我很早之前发现过,我也得出了相同的结论,我当时的想法是,这和编辑器的机制有所区别,就像是在cpython  ipython这些ide里面会有其他ide没有的独特命令一样,咱们只要记住py官网给出的结论就好了,毕竟绝大多数程序都是不在交互式的情况下编写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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