Python中定义:具有相同内容的字符串是同一个对象 s1 = "Welcome to Python" s2 = "Welcome to Python"

s1==s2为True但是id(s1)==id(s2)又是为False既然是同一个对象,那为什么id会不同?... s1 == s2 为 True
但是 id(s1) == id(s2) 又是为 False
既然是同一个对象,那为什么id会不同?
展开
 我来答
z伊凡z
推荐于2018-04-10 · TA获得超过229个赞
知道小有建树答主
回答量:184
采纳率:0%
帮助的人:100万
展开全部

首先查阅资料推测了一下id()函数的原理,这里顺便引入一个is的概念来方便你理解,看下面这个表达式来说明以下三者之间的关系:

(ob1 is ob2) 等价于 (id(ob1) == id(ob2))

1. id():获取的是对象在内存中的地址


2. is :比对2个变量的对象引用(对象在内存中的地址,即id() 获得的值)是否相同。如果相同则返回True,否则返回False。换句话说,就是比对2个变量的对象引用是否指向同一个对象。


3. ==:比对2个变量指向的对象的内容是否相同。

ob1 == ob2 不代表一定会 id(ob1) == id(ob2),因为id()函数不仅要求内容相同,而且要求指向同一个对象。

就是说你问的问题其实是有问题的。。

或者说你的问法:“既然是同一个对象,那为什么id会不同?”有问题,因为“他们不是同一个对象”

但这不代表你的问题因为问法不太准确就没有讨论的价值了,他的价值在于:“为什么s1与s2不是同一个对象?”

这里做另一个小测试方便理解:

>>> a = 2.5
>>> b = 2.5
>>> c = b
>>> a is c
False
>>> a = 2
>>> b = 2
>>> c = b
>>> a is c
True

发现问题没?其实这是在python中的一个优化:即当很短的a,b赋值很短的字符串的时候,它们的id值相同,而很长的则不会。这说明本来字符串用这种赋值方式是应该分配不同的地址的,只不过python解释器在对值很小的int和很短的字符串的时候做了一点小优化,只分配了一个对象,让它们id一样了。这才是问题关键所在。


接着读资料顺便发现了一个a is b 但是 id(a) !=id(b) 的例子,当然看完后发现和这个问题没关系这里不限细说明。。


希望我的回答可以帮到你:-)

大冢姻秆
2016-07-27 · TA获得超过217个赞
知道答主
回答量:342
采纳率:100%
帮助的人:82.5万
展开全部
python内建函数总结 1. abs(x) abs()函数返回数字(可为普通型、长整型或浮点型)的绝对值。如果给出复数,返回值就是该复数的模。例如: >>>print abs(-2,4) 2.4 >>>print abs(4+2j) 4.472135955 2. apply(function,args[,keywords]) apply()函....
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式