鱼C论坛

 找回密码
 立即注册
查看: 887|回复: 8

编码小问题~

[复制链接]
发表于 2018-5-27 01:49:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kerwin_lui 于 2018-5-27 01:51 编辑

代码:
  1. a = "FishC"
  2. print(a, id(a))
  3. b = "小甲鱼"
  4. print(b, id(b))
复制代码


将以上代码运行两次,输出结果如下:
第一次:
FishC 189702584
小甲鱼 191592272

第二次:
FishC 189702584
小甲鱼 191592368


以上标红的id更新了!

问题:
不是说字符串是不可变的吗?为啥英文的id不变,而中文的id就会变呢?
好奇是编码的原因吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 09:06:53 | 显示全部楼层
好像还真是,由于有编码解码的问题,经过了函数id就不一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 10:46:48 | 显示全部楼层
这是python内部的一个优化。
一个对象的id值在CPython解释器里就代表它在内存中的地址,之所以中文每次id都不一样是因为每次运行你计算机给每个中文字符的内存空间都是临时开的自然就不一样。而python中对每个英文提前就存储了地址,这样可以增加程序运行的速度,但是中文属于"特殊字符",而且数量众多,不可能为其提前开辟内存空间,所以都是临时生成的,自然就不一样。
而在函数中,每个函数有自己独立的内存空间,所以在函数中声明的字符串id自然不与外面相同,而是随着函数内存的开辟而临时生成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-6-5 23:40:41 | 显示全部楼层
本帖最后由 Charles未晞 于 2018-6-5 23:44 编辑
  1. Return the “identity” of an object. This is an integer (or long
  2. integer) which is guaranteed to be unique and constant for this object
  3. during its lifetime. Two objects with non-overlapping lifetimes may
  4. have the same id() value.
  5. CPython implementation detail: This is the address of the object in memory.
复制代码

上面是Python官方文档说明的内容。。。
个人理解:
ID归根到底作用就是获得对象的内存地址,这是逻辑起点,其他的都是衍生结论,随手试了一下:
O%(A6)G9G49SLT~F6WV(0IO.png
并没有说字母组成字符串就不变了。。。所以楼上的结论也有待商榷,当然我是不认同楼上观点的。
楼上可能表达的无非两种意思:
(1)字母组成的字符串预存
26个字符自由组合且长度不限...多少内存都不可能预存。。。
(2)字母预存
预存a-z...我觉得楼上想要表达的意思大概是:
a的ASCII是01100001,这个是固定的。这方面的意思吧。提前存储来增加程序运行速度这个说法...我只能说挺唬人/幽默的...


但可以肯定的是,这与编码无关。编码的本质是为了人机交互,也就是让机器明白你在说啥,让你明白机器在说啥。而存储地址,相当于你的话编码为二进制之后在计算机中的家庭住址。
至于ID,官方表达的意思是,在同一个生命周期内,是不变的。我的实验结果是在不同生命周期内,是可变的,也就是动态分配的。各种杂七杂八的规则记不清了,底层的东西大一的时候学过,现在都忘了,也说不出个道道来,怕误人子弟。
最后:
发现你是一个心思细腻的小伙子~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-12 00:35:17 | 显示全部楼层
Charles未晞 发表于 2018-6-5 23:40
上面是Python官方文档说明的内容。。。
个人理解:
ID归根到底作用就是获得对象的内存地址,这是逻辑起 ...

哈哈哈哈,谢谢你~~~
忍不住冒昧的问问,你是小姐姐还是小哥哥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-14 15:31:27 | 显示全部楼层
kerwin_lui 发表于 2018-6-12 00:35
哈哈哈哈,谢谢你~~~
忍不住冒昧的问问,你是小姐姐还是小哥哥?

♂  所以应该是“小哥哥”?
Emmm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-14 16:05:08 | 显示全部楼层
先去看id()这个方法到底是干嘛用的
    """
    Return the identity of an object.
   
    This is guaranteed to be unique among simultaneously existing objects.
    (CPython uses the object's memory address.)
    """
返回一个对象的身份。
这保证在同时存在的对象中是唯一的。
(CPython使用对象的内存地址。)
id返回的是一个对象的内存地址。但是如果是引用的话,就可能有相同的对象地址。
  1. a='1234'
  2. b=a
  3. print(id(a))
  4. print(id(b))
复制代码

这个时候输出的两个对象的地址是完全一样的,所b是对a的引用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-14 23:10:13 | 显示全部楼层
colinshi 发表于 2018-6-14 16:05
先去看id()这个方法到底是干嘛用的
    """
    Return the identity of an object.

不好意思,你好像没有理解我的意思。。。。我说的是中文字符的id为啥运行两次会变。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-14 23:12:03 | 显示全部楼层
Charles未晞 发表于 2018-6-14 15:31
♂  所以应该是“小哥哥”?
Emmm

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 16:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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