Python中定义:具有相同内容的字符串是同一个对象 s1 = "Welcome to Python" s2 = "Welcome to Python"
答案:2 悬赏:10 手机版
解决时间 2021-04-04 02:02
- 提问者网友:了了无期
- 2021-04-03 10:09
Python中定义:具有相同内容的字符串是同一个对象 s1 = "Welcome to Python" s2 = "Welcome to Python"
最佳答案
- 五星知识达人网友:独行浪子会拥风
- 2021-04-03 11:26
首先查阅资料推测了一下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) 的例子,当然看完后发现和这个问题没关系这里不限细说明。。
希望我的回答可以帮到你:-)
(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) 的例子,当然看完后发现和这个问题没关系这里不限细说明。。
希望我的回答可以帮到你:-)
全部回答
- 1楼网友:狂恋
- 2021-04-03 12:02
python内建函数总结 1. abs(x) abs()函数返回数字(可为普通型、长整型或浮点型)的绝对值。如果给出复数,返回值就是该复数的模。例如: >>>print abs(-2,4) 2.4 >>>print abs(4+2j) 4.472135955 2. apply(function,args[,keywords]) apply()函....
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯