Python的51个“秘密”被曝光
|
中的部分内容,也许你听说过,但依然可能会透露一些你所不知道的Python有趣特性。 我觉得这是学习编程语言内部原理的好机会,而且我相信你也会从中获得乐趣! 如果你是一位经验比较丰富的Python程序员,你可以试试能否一次就找到正确答案。 也许你对其中的一些例子比较熟悉,那这些案例能唤起你当年踩坑时的甜蜜回忆。 这个项目的中文版全文大约2万字,干货多的快要溢出来了,大家可以先看一下些行为是由于 Cpython 在编译优化时,某些情况下会尝试使用已经存在的不可变对象,而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[string interning]) 发生驻留之后,许多变量可能指向内存中的相同字符串对象。(从而节省内存) 在上面的代码中,字符串是隐式驻留的。何时发生隐式驻留则取决于具体的实现。这里有一些方法可以用来猜测字符串是否会被驻留: 所有长度为 0 和长度为 1 的字符串都被驻留。 字符串在编译时被实现。('wtf' 将被驻留, 但是 ''.join(['w', 't', 'f'] 将不会被驻留) 字符串中只包含字母,数字或下划线时将会驻留。所以 'wtf!' 由于包含!而未被驻留。可以在这里找CPython对此规则的实现。在同一行将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量。 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 wtf! 对象 (因为 "wtf!" 不是按照上面提到的方式被隐式驻留的)。 它是一种编译器优化,特别适用于交互式环境。 常量折叠(constant folding) 是 Python 中的一种窥孔优化(peephole optimization) 技术。 这意味着在编译时表达式 'a'*20 会被替换为 'aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期。 只有长度小于 20 的字符串才会发生常量折叠。(为啥? 想象一下由于表达式'a'*10**10 而生成的 .pyc 文件的大小)相关的源码:明: 当调用 id 函数时, Python 创建了一个 WTF 类的对象并传给 id 函数。 然后 id 函数获取其id值 (也就是内存地址), 然后丢弃该对象. 该对象就被销毁了。 当我们连续两次进行这个操作时, Python会将相同的内存地址分配给第二个对象。 因为 (在CPython中) id 函数使用对象的内存地址作为对象的id值, 所以两个对象的id值是相同的。 综上, 对象的id值仅仅在对象的生命周期内唯一。在对象被销毁之后, 或被创建之前, 其他对象可以具有相同的id值。
那为什么 is 操作的结果为 False 呢? 让我们看看这段代码: (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


浙公网安备 33038102330468号