你不知道的Python(1)

这将会一个系列的文章,相当于是在观看Github上的一个有趣项目wtfpython之后一个随笔。

字符串的驻留[string interning]

我们首先看一个示例:

会发现,用两种不同方式定义的相同内容的字符串,他们的id是相同的

那么我们再看一个例子:

会发现,具有相同内容的不同变量,他们实际上是指向同一个内存地址。那么照此类推,我们可以猜测,即使两个字符串变量的定义方式或者变量名不同,但是实际上他们是指向同一个内存地址。

但是事实果真如此吗?请看第三个示例:

此时变量a、b内容完全一样,但是(a is b)得到的结果却是false。

那么接下来的两个示例也会让你同样摸不着头脑:

为什么会出现这种情况呢?其实这都是由一个被称作字符串驻留的行为导致的:Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象。发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)

而刚才我们所看到的代码都是字符串发生的隐式驻留。那么什么情况下会发生隐式驻留呢:

1、所有长度为0和1的字符串都会自动驻留;

2、字符串在被编译时驻留 ('str' 将被驻留, 但是 ''.join(['s', 't', 'r'] 将不会被驻留);

3、字符串中只包含字母,数字或下划线时将会驻留(所以上面代码中的"string!"由于含有!而不会发生驻留,所以最后结果为false);

4、当在同一行将 a 和 b 的值设置为 "string!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量. 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 string 对象;

5、常量折叠(constant folding) 是 Python 中的一种 窥孔优化(peephole optimization) 技术. 这意味着在编译时表达式 'a'*20会被替换为 'aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期. 只有长度小于 20 的字符串才会发生常量折叠。为什么会有这种限制呢?你可以想象一下当后面跟的数字极大的时候,比如为10**1000,那么其带来的代价将是极大的

好了,这就是在这里要跟大家分享的关于python的一个小特性。

大家可以去多多支持原作者,原链接如下:https://github.com/leisurelicht/wtfpython-cn#structure-of-the-examples%E7%A4%BA%E4%BE%8B%E7%BB%93%E6%9E%84

猜你喜欢

转载自blog.csdn.net/hello15523938742/article/details/85481039