【发布时间】:2013-12-31 00:30:03
【问题描述】:
Python 的 documentation on the methods related to the in-place operators 像 += 和 *=(或者,正如它所说的那样,增强算术赋值)有以下说法:
这些方法应该尝试就地执行操作(修改 self)并返回结果(可以是,但不一定是,self)。如果未定义特定方法,则扩充分配回退到正常方法。
我有两个密切相关的问题:
- 如果文档规定,如果实现了这些方法,那么为什么必须从这些方法中返回任何内容?在实现
__iadd__的情况下,为什么增广赋值运算符不执行冗余赋值? - 在什么情况下从增强赋值方法返回
self以外的东西才有意义?
一个小实验表明 Python 的不可变类型没有实现 __iadd__(这与引用的文档一致):
>>> x = 5
>>> x.__iadd__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'
当然还有它的可变类型的__iadd__方法,就地操作并返回self:
>>> list1 = []
>>> list2 = list1
>>> list1 += [1,2,3]
>>> list1 is list2
True
因此,我无法弄清楚从__iadd__ 返回除self 以外的东西的能力是什么。在任何情况下,这似乎都是错误的事情。
【问题讨论】:
-
l = [1, 2, 3]; l = l.__iadd__([3, 2, 1]) + [1]; >>> l [1, 2, 3, 3, 2, 1, 1] -
@Smac89 很好 - 这是一个古怪但只是合法的理由
__iadd__有一个返回值,所以我想我可以检查我的第一个问题。不过,我仍然对第二个问题感到困惑 - 在什么情况下,从__iadd__方法返回除self以外的其他内容是有用或正确的,因为文档表明是允许的? -
对于像
x[[0, 1]] += 2这样的情况,赋值是必要的,其中x是一个 NumPy 数组,并且赋值将 2 添加到选定索引的列表中。不过,我想不出除了self之外的任何情况。 -
@Smac89:实际上,我不确定这是一个很好的理由。您可以很容易地争辩说
l = l.sort() + [1]应该有效,而它(故意)无效。 -
我想指出
+=没有值。例如,无论bar是什么类型,foo = (bar += 1)都是语法错误。因此,除非您希望您的客户直接致电__iadd__(他们的头脑正常的人会这样做吗?!)它并不重要您从中返回什么。
标签: python