|
发表于 2022-6-23 23:28:35
|
显示全部楼层
本帖最后由 白two 于 2022-6-23 23:30 编辑
python 有驻留机制,
不符合驻留机制的时候, 即使两个字符串相等, 也是两个不同的对象
驻留机制并不是对所有的数字,字符串,它只对“ [0-9] [a-z] [A-Z]和"_"(下划线) ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的
- 字符串长度为0或1时,默认采用驻留机制;
- 字符串长度大于1时,且 字符串中只包含大小写字母、数字、下划线(_) 时,采用驻留机制;
- 对于 [-5,256]之间的整数数字,Python默认驻留 ;
- 字符串 只在编译时进行驻留,而非运行时 。Python是解释型语言,但是事实上,它的解释器也可以是理解为是一种编译器,它负责将Python代码翻译成字节码,也就是.pyc文件;
- 用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。这样的设计目的是为了保护.pcy文件不会被错误代码搞的过大。
例如:
- >>> a = 'aabb@#'
- >>> b = 'aabb@#'
- >>> a is b
- False
复制代码- >>> a = 'abc'
- >>> b = 'abc'
- >>> a is b
- True
复制代码
- >>> a = 'abcd'
- >>> b = 'abc'
- >>> id(a[0])
- 2881267427440
- >>> id(b[0])
- 2881267427440
- >>> a[0] is b[0]
- True
复制代码
但是如果:
- >>> id(a[0:2])
- 2881301834288
- >>> id(b[0:2])
- 2881302064944
- >>> a[0:2] is b[0:2]
- False
复制代码
因为这里是两个新的对象
并且python中的驻留发生在compile_time,而不是run_time
- >>> str1='sten'+'waves' # compile_time
- >>> str1 is 'stenwaves'
- True
-
- >>> str3='sten'
- >>> str4=str3+'waves'
- >>> str4 is 'stenwaves' # run_time
- False
复制代码
你的这个虽然最后结果相等, 但是是在运行的时候才会出来, 所以并不会采用驻留机制, 也就会导致两个字符串虽然相等, 但是是两个不同的对象, 占用了不同的内存
并且因为你是单个单个加的, 所以也会创建新的对象
- >>> a = 'abc'
- >>> j = ''
- >>> j += 'a'
- >>> j += 'b'
- >>> j += 'c'
- >>> j is a
- False
- >>> j = ''
- >>> j += 'abc'
- >>> j is a
- True
复制代码
|
|