is和 =
一般新建一个对象,内存地址是不相同的,下面的是例外。
字符串有小地址池的要求:不能有空格、没有特殊字符和字符长度小于等于20.
数字-5到256
a is b:a和b的内存地址相等
a == b :a和b的值相等
a = b =1,:是1的两个标签
a = 1和b = 1理论上说对象是不一样的。
>>> a =1 >>> b =1 >>> c = 2 >>> a == b #值相等 True >>> a == c False >>> a is b #a和b指向的是一个值,内存地址相同 True >>> a is c False >>> e = 365 #但是有例外 >>> f = 365 >>> e is f False >>> e == f True
先要在重新声明的是:字符串、数字都是属于非容器,因此不存在拷贝一说。
按理说,365和1都是属于类原子类型,都是不能在更改,为啥会有完全不同的结果了?
这是因为对于数字来说,有一个小数据池,创建相同的数字对象,都会指向一个相同的数据池,范围在-5~~255之间,这样做也是为了节省内存。
>>> e = 365 >>> f = 365 >>> e is f False >>> e == f #值虽然相等 True >>> id(e) #内存地址并不相同 139928493356080 >>> id(f) 139928493355696
相对于数字来说,没有空格的字符串也有小数据池。
>>> oo = 'wo shi' >>> op = 'wo shi' >>> id(oo) 139928493584544 >>> id(op) 139928493584656 >>> a = 'wqrqw' #有地址池,长度在20以内都是共享内存的 >>> b = 'wqrqw' >>> id(a) 139928493545768 >>> id(b) 139928493545768
>>> skt = 'k'*20 >>> kt = 'k'*20 >>> id(skt) 139717594629728 #长度20的时候内存地址是一样的 >>> id(kt) 139717594629728 >>> edg = 'j'*21 >>> ede = 'j'*21 >>> id(edg) #大于20的时候内存地址是不一样的 139717594629800 >>> id(ede) 139717594629872