相关疑难解决方法(0)

当'[]是[]'并且'{}是{}'返回False时,为什么'()是()'返回True?

根据我的意识,使用[], {}()实例化对象会分别返回一个list, dict或新的实例tuple; 具有新标识的新实例对象.

这对我来说非常清楚,直到我实际测试它并且我注意到() is ()实际返回True而不是预期False:

>>> () is (), [] is [], {} is {}
(True, False, False)
Run Code Online (Sandbox Code Playgroud)

正如所料,与创建对象时,这种行为还表现list(),dict()tuple()分别为:

>>> tuple() is tuple(), list() is list(), dict() is dict()
(True, False, False)
Run Code Online (Sandbox Code Playgroud)

我可以在状态文档中tuple()找到的唯一相关信息:

[...]例如,tuple('abc')退货('a', 'b', 'c')tuple([1, 2, 3])退货(1, 2, 3).如果没有给出参数,构造函数会创建一个新的空元组().

可以说,这还不足以回答我的问题.

那么,为什么空元组具有相同的身份,而其他像列表或词典不具有相同的身份?

python identity tuples python-3.x python-internals

47
推荐指数
1
解决办法
3853
查看次数

如何在CPython中实现元组?

我一直在努力学习如何在幕后实现CPython.Python很高级很棒,但我不喜欢把它当成黑盒子.

考虑到这一点,元组是如何实现的?我已经看过了源码(tupleobject.c),但它已经过了我的脑海.

我看到的PyTuple_MAXSAVESIZE = 20PyTuple_MAXFREELIST = 2000,什么是节约型和"自由列表"?(长度为20/21或2000/2001的元组之间是否存在性能差异?什么强制实现最大元组长度?)

python tuples cpython data-structures python-internals

25
推荐指数
2
解决办法
5192
查看次数

为什么Python在格式化时将此字符串解释为字典?

我在使用format看起来像Python字典的字符串时遇到问题.

我想生成以下字符串:{"one":1} 如果我尝试这样做:

'{"one":{}}'.format(1)
Run Code Online (Sandbox Code Playgroud)

解释器抛出一个KeyError:

>>> a = '{"one":{}}'.format(1)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
KeyError: '"one"'
Run Code Online (Sandbox Code Playgroud)

据我所知,这个问题大概在该字符串中包含的事实围绕{,可以用混淆format{}.为什么会发生这种情况,如何解决?

我知道百分比格式,但我想找到一个不涉及开沟的解决方案format().

python string string-formatting python-3.x

11
推荐指数
2
解决办法
1331
查看次数

使用Python 2.x中的'is'运算符将对象与空元组进行比较

if obj is None:以前在Python 看过,我最近遇到过 if obj is ():.由于元组不可变,因此在Python解释器中听起来像是一个合理的内部优化,因为空元组是单个元素,因此允许使用is而不是要求==.但这有保证吗?从哪个版本的翻译?

[编辑]问题很重要因为if()不是单例并且有一种方法可以生成一个具有不同地址的空元组,那么使用is {}就是一个bug.如果仅在Python 2.x之后保证x> 0,那么如果需要确保代码的向后兼容性,则必须知道x的值.在使用pypy/jython/ironpython时,知道这是否会破坏你的代码也很重要...

python

8
推荐指数
1
解决办法
605
查看次数