问题标签 [python-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 为什么 Python 列表加法必须是同质的?
任何熟悉 Python 内部结构(CPython 或其他实现)的人都可以解释为什么列表添加必须是同质的:
为什么上述内容不应该返回与上述成绩单中x+"foo"
的最终值相同的值?x
这个问题来自 NPE 的问题:Python's list += iterable 的行为是否记录在任何地方?
更新:我知道不需要异构+=
工作(但确实如此),同样,不需要异构工作+
是错误的。这个问题是关于为什么做出后一种选择。
说将序列添加到列表中的结果是不确定的,这太过分了。如果这是一个充分的反对意见,那么防止异质+=
. 更新 2:特别是,python 总是将运算符调用委托给左侧操作数,因此不会出现“什么是正确的事情”的问题:左侧对象总是管理(除非它委托给右侧)。
更新 3:对于任何争论这是一个设计决定的人,请解释 (a) 为什么它没有记录在案;(b) 记录在案的地方。
Update4:“应该[1] + (2, )
返回什么?” 它应该返回一个结果值,该值等于x
最初保持[1]
在 之后的变量的值x+=(2, )
。这个结果是明确定义的。
python - 从类定义中的列表理解访问类变量
您如何从类定义中的列表理解访问其他类变量?以下在 Python 2 中有效,但在 Python 3 中失败:
Python 3.2 给出了错误:
尝试Foo.x
也不行。关于如何在 Python 3 中执行此操作的任何想法?
一个稍微复杂的激励示例:
在这个例子中,apply()
这本来是一个不错的解决方法,但遗憾的是它已从 Python 3 中删除。
python - __slots__ 如何避免字典查找?
我听说__slots__
通过避免字典查找使对象更快。我的困惑来自 Python 是一种动态语言。在静态语言中,我们a.test
通过编译时优化来避免字典查找,以将索引保存在我们运行的指令中。
现在,在 Python 中,a
可以很容易地成为具有字典或不同属性集的另一个对象。似乎我们仍然需要进行字典查找 - 唯一的区别似乎是我们只需要一个类的字典,而不是每个对象的字典。
有了这个理性,
- 如何
__slots__
避免字典查找? - 插槽是否使访问对象更快?
python - 元组在 CPython 中是如何实现的?
我一直在尝试了解如何在场景下实现 CPython。Python 是高级别的很好,但我不喜欢把它当作一个黑盒子。
考虑到这一点,元组是如何实现的?我已经查看了源 (tupleobject.c),但它超出了我的想象。
我看到了PyTuple_MAXSAVESIZE = 20
,PyTuple_MAXFREELIST = 2000
什么是保存和“免费列表”?(长度为 20/21 或 2000/2001 的元组之间会有性能差异吗?是什么强制最大元组长度?)
python - obj.__closure__ 中究竟包含什么?
Beazley pg 100 提到:
我的理解是这__closure__
是一个列表,但是这些单元格的东西和 str 对象是什么?这看起来像一个一元元组?
python - 解释器维护的整数缓存是怎么回事?
在深入研究 Python 的源代码后,我发现它维护了一个PyInt_Object
s 数组,范围从int(-5)
到int(256)
(@src/Objects/intobject.c)
一个小实验证明了这一点:
但是,如果我在 py 文件中一起运行这些代码(或用分号连接它们),结果会有所不同:
我很好奇为什么它们仍然是同一个对象,所以我更深入地研究了语法树和编译器,我想出了下面列出的调用层次结构:
PyInt_FromLong
然后我在里面和之前/之后添加了一些调试代码PyAST_FromNode
,并执行了一个test.py:
输出看起来像:
意思是在cst
toast
变换的过程中,PyInt_Object
创建了两个不同的s(实际上是在ast_for_atom()
函数中执行的),但是后来又合并了。
我发现很难理解 and 中的来源PyAST_Compile
,PyEval_EvalCode
所以我在这里寻求帮助,如果有人提供提示,我将不胜感激?
python - 为什么字典和集合中的顺序是任意的?
我不明白如何通过“任意”顺序循环遍历字典或在 python 中设置。
我的意思是,它是一种编程语言,所以语言中的所有内容都必须 100% 确定,对吗?Python 必须有某种算法来决定选择字典或集合的哪一部分,第一,第二等等。
我错过了什么?
python - Python字符串实习
虽然这个问题在实践中没有任何实际用途,但我很好奇 Python 如何进行字符串实习。我注意到以下内容。
这正如我所料。
你也可以这样做。
这很聪明!
但你不能这样做。
为什么 Python 不会评估s1+"g"
,并意识到它与相同s2
并将其指向相同的地址?最后一个区块实际上发生了什么让它返回False
?
python - .pyc 文件何时刷新?
我知道“.pyc”文件是纯文本“.py”文件的编译版本,在运行时创建以使程序运行得更快。但是我观察到一些事情:
- 修改“py”文件后,程序行为会发生变化。这表明“py”文件已编译或至少经过某种散列过程或比较时间戳以判断是否应重新编译它们。
- 删除所有“.pyc”文件 (
rm *.pyc
) 后,有时程序行为会发生变化。这表明它们没有在更新“.py”时被编译。
问题:
- 他们如何决定何时编译?
- 有没有办法确保他们在开发过程中进行更严格的检查?