问题标签 [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.

0 投票
3 回答
2089 浏览

python - Python 的 list.remove(value) 如何确定要删除的值?

如果我有对象列表:

然后我删除其中一个对象:

python如何确定要删除列表中的哪个项目(在引擎盖下)?

它是否使用 的内存位置a?(您可以查看hex(id(a))

0 投票
1 回答
544 浏览

python - Python 2 使用什么方法打印元组?

Python 的print语句通常似乎打印了repr()它的输入。元组似乎也不例外:

但后来我在搞乱 CPython 的内部时偶然发现了一些奇怪的行为。简而言之:如果你欺骗 Python 2 创建一个自引用元组,直接打印它的行为与打印它的//repr()表示完全不同。str()unicode()

那么具体在print做什么呢?为了自己回答这个问题,我参考了语言参考:

6.6. print声明_

print依次计算每个表达式并将结果对象写入标准输出(见下文)。如果对象不是字符串,则首先使用字符串转换规则将其转换为字符串。

字符串转换的规则是:

5.2.9。字符串转换

字符串转换是用反向(也称为反向)引号括起来的表达式列表:

但是用反引号括起来与呼叫和朋友outer的结果相同。repr()没有骰子。那么到底print在幕后到底在做什么呢?

(有趣的是,这种行为在 Python 3 中是“固定的”:打印自引用元组会给出省略号截断的形式。)

0 投票
3 回答
345 浏览

python - Writing (and not) to global variable in Python

Coming from much less dynamic C++, I have some trouble understanding the behaviour of this Python (2.7) code.

Note: I am aware that this is bad programming style / evil, but I would like to understand it non the less.

#xA;

This code runs without error, and f manipulates the (seemingly) global list. This is contrary to my prior understanding that global variables that are to be manipulated (and not only read) in a function must be declared as global ....

On the other hand, if I replace vals[0] = 5 with vals += [5,6], execution fails with an UnboundLocalError unless I add a global vals to f. This is what I would have expected to happen in the first case as well.

Could you explain this behaviour?

Why can I manipulate vals in the first case? Why does the second type of manipulation fail while the first does not?

Update: It was remarked in a comment that vals.extend(...) works without global. This adds to my confusion - why is += treated differently from a call to extend?

0 投票
3 回答
5431 浏览

python - Pythonfrozenset散列算法/实现

我目前正在尝试了解为 Python 的内置frozenset数据类型定义的哈希函数背后的机制。实现显示在底部以供参考。我特别感兴趣的是选择这种散射操作的基本原理:

其中h是每个元素的哈希值。有谁知道这些是从哪里来的?(也就是说,选择这些数字有什么特别的原因吗?)还是他们只是随意选择的?


这是官方 CPython 实现的片段,

Python 中的等效实现

0 投票
4 回答
2936 浏览

python - NoneType的实现、原因和细节

我最近在某处读到,Nonepython 中的特殊值是它自己类的单例对象,特别是NoneType. 这解释了很多,因为涉及Nonepython 的大多数错误都会产生AttributeErrors 而不是一些特殊的“NoneError”或其他东西。

由于所有这些都AttributeErrors反映了所NoneType缺乏的属性,因此我对NoneType 确实具有的属性(如果有的话)产生了兴趣。

我决定对此进行调查NoneType并了解更多信息。我一直发现了解新语言功能的最佳方法是使用它,因此我尝试NoneType在 IDLE 中进行实例化:

这产生了一个错误:

很困惑,我检查None了我是否得到了正确的类型名称。果然,

现在很困惑,我做了一个快速的谷歌搜索。这表明出于某种原因 NoneType 在 Python 3 中以某种方式被删除。

好吧,我虽然,哈哈!None我可以通过将类型存储在变量中来解决这个问题,因为类是 python 中的对象。这似乎有效:

当我打印 n 时,我得到了几乎我所期望的:

但后来发生了这样的事情:

和:

我的变量nNone。不仅同类型None。它是None。这不是我所期望的。

我尝试使用dis来获取更多信息NoneType,但是当我打电话时

它没有产生任何输出。

然后我尝试调查该__new__方法,几个用户在评论中提到了该方法:

更多错误。

以下是我的问题:

  • 为什么n与 Object 完全相同None
  • 为什么将语言设计n为与 Object 完全相同None
  • 甚至如何在 python 中实现这种行为?
0 投票
2 回答
109 浏览

python - Python 属性实例行为

我知道什么是property/descriptordecorator。但我很难理解这一点。

Descriptor是类级别的对象。所以应该得到相同@name.setter的描述符对象。当我在 and 之后添加打印语句时,我得到以下结果:@name.getternamesettergetter

(a) 和 (c) 语句具有相同的property对象,但 (b) 没有。

有人可以解释一下为什么会这样还是我错过了什么?

0 投票
2 回答
22830 浏览

python - Python unittest 模块中 unittest.main() 的含义

我试图学习 Python 中的单元测试,特别是unittest模块。

考虑以下几行:

由于对unittest.main().

我只是想知道这个调用是如何让所有测试用例运行的。

我知道,因为我从unittest.TestCase每个测试类继承,它正在做所有的魔法。有什么见解吗?

0 投票
2 回答
339 浏览

python - Python方法访问器在每次访问时创建新对象?

在调查另一个问题时,我发现以下内容:

这是意料之中的:

但这是我没想到的:

尤其不是这个:

Python 似乎为每个方法访问创建新对象。为什么我会看到这种行为?即它不能重用每个类和每个实例一个对象的原因是什么?

0 投票
1 回答
18672 浏览

python - 元组 (a,b)=(b,a) 中的成员交换如何在内部工作?

这种 a 和 b 值的交换如何在内部工作?它绝对不使用临时变量。

0 投票
1 回答
11501 浏览

python - “del”到底是做什么的?

这是我的代码:

当我从解释器运行它时,这就是输出:

Line # Mem 使用增量行内容

如果您注意到输出,创建巨大的列表消耗了 621.5 MB,而删除它只释放了 152.6 MB。当我检查文档时,我发现了以下语句:

所以我猜,它并没有删除对象本身,而是取消绑定它。但是,它释放了这么多空间(152.6 MB)在解除绑定时做了什么。有人可以痛苦地向我解释这里发生了什么吗?