1205768305 发表于 2022-3-17 18:12:08

id相关问题

python中编辑器模式下,用256以上的数字或者中文汉字的字符串或者元组等不可变对象创建两个相同数据的变量,发现他们的id相同,但是在交互模式下他们的id不同,按道理来说,他们的id应该不同,为什么在编辑器下却相同呢?

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

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

python爱好者. 发表于 2022-3-17 18:17:18

你重新试试,两个 id 实际是一样的,
因为字符串是一个不可变类型的数据,所以 a 和 b 能都指向 "中国",
如果换成列表这类可变数据类型的数据,如:["中国"],id 便不会相等了!

python爱好者. 发表于 2022-3-17 18:19:44

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

小甲鱼新课里的课后作业中讲过的,具体那一讲容我想想......

1205768305 发表于 2022-3-17 18:20:56

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

1205768305 发表于 2022-3-17 18:21:35

这和小甲鱼的课关系不大

python爱好者. 发表于 2022-3-17 18:22:52

1205768305 发表于 2022-3-17 18:21
这和小甲鱼的课关系不大

???你重新打开 IDLE 试一下,我是 True

1205768305 发表于 2022-3-17 18:24:28

python爱好者. 发表于 2022-3-17 18:22
???你重新打开 IDLE 试一下,我是 True

如果是数字字母或者下划线的话,id确实应该相同,但是如果是汉字就不应该相同

python爱好者. 发表于 2022-3-17 18:28:42

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

不是应该相同吗?只要两个变量都同时赋值为同一个 字符串 ,
它们所对应的就肯定都是一个 id,因为它是字符串。
数字这类才需要管这些吧......

python爱好者. 发表于 2022-3-17 18:30:48

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

重点它是字符串呀......

1205768305 发表于 2022-3-17 18:37:27

python爱好者. 发表于 2022-3-17 18:30
重点它是字符串呀......

字符串比较特殊,内部做了缓存机制,当你创建了一个字符串时,如果再次创建一个相同的字符串时,会使用第一个已经创建的内存地址,并且只能是字母数字下划线,长度不能超过20

1205768305 发表于 2022-3-17 18:38:28

变成我回答你问题了

python爱好者. 发表于 2022-3-17 18:39:01

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

好吧......我没有学那没彻底......
小甲鱼说过吗?

1205768305 发表于 2022-3-17 18:52:16

python爱好者. 发表于 2022-3-17 18:39
好吧......我没有学那没彻底......
小甲鱼说过吗?

不知道说没说过

python爱好者. 发表于 2022-3-17 18:53:04

1205768305 发表于 2022-3-17 18:52
不知道说没说过

我还专门写了一大张纸呢,没有说过呀......

阿奇_o 发表于 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语言吧, 我暂时到这先打注了   ^_

老沫白 发表于 2022-3-18 08:19:17

单纯的指向同一个对象啊

Python初学者8号 发表于 2022-3-18 08:46:24

你这个问题我很早之前发现过,我也得出了相同的结论,我当时的想法是,这和编辑器的机制有所区别,就像是在cpythonipython这些ide里面会有其他ide没有的独特命令一样,咱们只要记住py官网给出的结论就好了,毕竟绝大多数程序都是不在交互式的情况下编写的{:5_102:}
页: [1]
查看完整版本: id相关问题