WTFpython 有趣好玩的python现象
1. "is"与“==”
>>> a=256
>>> b=256
>>> a is b
True
>>>a=257
>>>b=257
>>>a is b
False
>>>a=257; b=257
>>>a is b #当a,b在同一行时,两者指向同一个对象,所以为True
True
>>>id(a)
2959262439888 #id值一样 是同一个对象
>>>id(b)
2959262439888
>>>id(256)
140720476640048 #-5~-256 是固有的 内存地址不变 每次使用都相当于提取是同一个对象
>>>id(257)
>>>2959262439504 #两个257不一样 时两个对象其id地址都不一样
>>>id(257)
>>>2959262439888
>>>id(256)
140720476640048
说明:
首先一二代码块出现不一样的结果的原因是 is是判断身份,is不仅要判断值 还要判断对象是否一致 而==只是比较值 因为(-5-256)经常被我们使用 所以python内部就自动设置为存在的对象,我们使用的时候这部分的数字时 其实就只是提取存在的这部分的数字而已,id地址这些都是固定了的,多次使用同一个这部分的数字其实都是同一个对象。257超过python内部设置存在的对象,每使用257 就相当于创建一个对象,其id地址都会不一样,**虽然都是257 但是不是同一个对象。所以用is判断就是False 用==判断就是True了
>>>a="wtf"
>>>b="wtf" #字符串长度为0 或1 的对象都会被驻留,此处wtf被驻留 第二次使用wtf
>>>a is b # 其实是直接引用的第一次驻留的wtf 两者为同一对象
True
>>>a="wtf!"
>>>b="wtf!"
> > > a is b # 驻留的原则是 字符串中只包含字母 数字 下划线时才能被驻留
False # 此处有“!” 不能被驻留 所以两者为不同的对象 所以False
>>>a,b="wtf!","wtf!"
>>>a is b # 在同一行时 被认为是同一对象
True
>>>a*20 is"aaaaaaaaaaaaaaaaaaaa" # python中长度小于等于20的字符串会发生常量折叠
True #常量折叠意思就是当编译器编译遇到a*20时就立即
# 用“aaaaaaaaaaaaaaaaaaaa"代替 而不是每次都 将a*20计算一遍
>>>a*21 is"aaaaaaaaaaaaaaaaaaaaaa"
False #超过20 不会折叠 错误
# 经过多次试验 字典里如果有两个key一样 那么输出的值都是**后一个value** 或许是python设置就是这样
>>>b={'a':'b','a':'c'}
>>>print(b['a'])
c
>>>b={5:'c'5.0:'a'}
>>>print(b[5])
a
>>>print(b[5.0])
a