Python教程:微妙的字符串

开课吧开课吧锤锤2021-07-15 16:44

Python是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候Python的一些输出结果对于初学者来说似乎并不是那么一目了然。GitHub有个仓库收集Python中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性,并尝试讨论这些现象背后真正的原理!  

微妙的字符串

微妙的字符串  

>>> a = "some_string"
>>> id(a)
140420665652016
>>> id("some" + "_" + "string") # 注意两个的id值是相同的.
140420665652016
>>> a = "wtf"
>>> b = "wtf"
>>> a is b
True

>>> a = "wtf!"
>>> b = "wtf!"
>>> a is b
False

>>> a, b = "wtf!", "wtf!"
>>> a is b 
True # 3.7 版本返回结果为 False.
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
False # 3.7 版本返回结果为 True

很好理解,对吧?  

说明:  

这些行为是由于Cpython在编译优化时,某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[stringinterning])。  

发生驻留之后,许多变量可能指向内存中的相同字符串对象.(从而节省内存)。  

在上面的代码中,字符串是隐式驻留的,何时发生隐式驻留则取决于具体的实现.这里有一些方法可以用来猜测字符串是否会被驻留:  

所有长度为0和长度为1的字符串都被驻留。

字符串在编译时被实现('wtf'将被驻留,但是''.join(['w','t','f'])将不会被驻留)。  

字符串中只包含字母,数字或下划线时将会驻留.所以'wtf!'由于包含!而未被驻留。

微妙的字符串

当在同一行将a和b的值设置为"wtf!"的时候,Python解释器会创建一个新对象,然后同时引用第二个变量。如果你在不同的行上进行赋值操作,它就不会”知道”已经有一个wtf!对象(因为"wtf!"不是按照上面提到的方式被隐式驻留的)。它是一种编译器优化,特别适用于交互式环境。

常量折叠(constantfolding)是Python中的一种窥孔优化(peepholeoptimization)技术,这意味着在编译时表达式'a'*20会被替换为'aaaaaaaaaaaaaaaaaaaa'以减少运行时的时钟周期.只有长度小于20的字符串才会发生常量折叠。(为啥?想象一下由于表达式'a'*10**10而生成的。pyc文件的大小)。

如果你是使用3.7版本中运行上述示例代码,会发现部分代码的运行结果与注释说明相同。这是因为在3.7版本中,常量折叠已经从窥孔优化器迁移至新的AST优化器,后者可以以更高的一致性来执行优化。(由EugeneToder和INADANaoki在bpo-29469[5]和bpo-11549[6]中贡献。)  

(但是在最新的3.8版本中,结果又变回去了.虽然3.8版本和3.7版本一样,都是使用AST优化器.目前不确定官方对3.8版本的AST做了什么调整。)  

以上内容由开课吧小编为大家整理发布的“Python教程:微妙的字符串”一文,更多Python教程相关内容尽在开课吧广场Python教程频道。  

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
零基础轻松入门Python