gpt4 book ai didi

python - 理解Python的内置运算符重载行为

转载 作者:太空宇宙 更新时间:2023-11-03 20:22:45 25 4
gpt4 key购买 nike

++= 运算符重载上的列表和元组行为:

失败:

>>> [1,2] + (3,4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list

但这有效:

>>> l = [1,2]
>>> l += (3,4)
>>> l
[1, 2, 3, 4]

对于 set 和 freezeset ,事情的行为有所不同:

这有效:

>>> {1,2} | frozenset({3,4})
{1, 2, 3, 4}

这也有效:

>>> s = {1,2}
>>> s |= frozenset({3,4})
>>> s
{1, 2, 3, 4}

为什么[1,2] + (3,4) 的工作方式与{1,2} 类似| freezeset({3,4})

为什么两者不同?是否有一个原因?这是向后兼容性的问题还是与内部相关的问题?

我更感兴趣的是为什么会这样实现,而不是幕后技术上发生了什么。我怀疑 Python 语言的设计经过了一些仔细的思考,并且我想了解这种差异的原因。

最佳答案

主要区别在于实现不一致并且非常烦人。

在此示例中:

>>> l = [1,2]
>>> l += (3,4)

人们期望 l += (3, 4) 转换为 l = l + (3, 4) 并失败,但 list. __iadd__/set.__iadd__ 实现不同,并且改变原始对象。但它实际上大致翻译为:

l.extend((3, 4))

通过调用list.extend,可以使用(可能)任何可迭代对象来调用它:

>>> l = [1]
>>> l += {11, 31, 21} # <--- this should be a lot more troubling (no order)
>>> l
[1, 11, 21, 31] # worked, but obviously no order guarantees

这可能是出于效率原因,但它是隐式的并且非常容易出错。它形成了这个惯用的代码模式:

l = []
for items in items_generator:
l += items

无需用户考虑就能更好地扩展。

出于性能原因, native 数据结构的自定义实现(iadd(x, y)or_(x, y))是异常(exception)。

关于python - 理解Python的内置运算符重载行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com