我需要知道+ =在python中做什么。就这么简单。我也希望链接到python中其他速记工具的定义。
我需要知道+ =在python中做什么。就这么简单。我也希望链接到python中其他速记工具的定义。
Answers:
在Python中,+ =是__iadd__
特殊方法的糖衣,__add__
或者__radd__
如果__iadd__
不存在,则为+ 。__iadd__
类的方法可以执行任何所需的操作。列表对象实现了它,并使用它来迭代一个可迭代对象,该对象将每个元素附加到自身上,方法与列表的extend方法相同。
这是一个实现__iadd__
特殊方法的简单自定义类。您可以使用int初始化对象,然后可以使用+ =运算符添加数字。我在其中添加了一条打印语句,__iadd__
以表明它被调用了。另外,__iadd__
期望返回一个对象,因此我返回了自身的加号以及在这种情况下有意义的其他数字。
>>> class Adder(object):
def __init__(self, num=0):
self.num = num
def __iadd__(self, other):
print 'in __iadd__', other
self.num = self.num + other
return self.num
>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5
希望这可以帮助。
__iadd__
表示返回其他类型(其本身是可加的)
x += 5
与x = x + 5
Python中所说的不完全相同。
注意这里:
In [1]: x = [2,3,4]
In [2]: y = x
In [3]: x += 7,8,9
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]
In [6]: x += [44,55]
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]
In [9]: x = x + [33,22]
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]
请参阅以供参考:为什么+ =在列表上表现异常?
x += 7,8,9
+=
在变量中添加一个数字,从而在过程中更改变量本身(而+
不会)。与此类似,以下内容也可以修改变量:
-=
,从变量中减去一个值,将变量设置为结果*=
,将变量和一个值相乘,结果就是变量/=
,将变量除以值,使结果成为变量%=
,对变量执行模数,然后将变量设置为其结果可能还有其他。我不是Python程序员。
它将右边的操作数添加到左边。 x += 2
手段x = x + 2
它还可以将元素添加到列表中-请参见此SO线程。
这不仅仅是语法上的捷径。试试这个:
x=[] # empty list
x += "something" # iterates over the string and appends to list
print(x) # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
与
x=[] # empty list
x = x + "something" # TypeError: can only concatenate list (not "str") to list
这说明+ =调用iadd list方法,而+调用add,后者对列表执行不同的操作。
通常,a + = b将b“加”到将结果存储到a中。这种简单的描述将以多种语言描述+ =运算符。
然而,简单的描述提出了两个问题。
在python中,这两个问题的答案取决于a的数据类型。
那么“加”到底是什么意思?
请注意,对于列表+ =比+更具灵活性,列表上的+运算符需要另一个列表,但是+ =运算符将接受任何可迭代的。
那么“将值存储在”中意味着什么呢?
如果对象是可变的,则鼓励(但不是必需)就地执行修改。因此,指向以前做过的同一个对象,但是该对象现在具有不同的内容。
如果对象是不可变的,则显然不能就地执行修改。一些可变对象也可能没有就地“添加”操作的实现。在这种情况下,变量“ a”将更新为指向包含加法运算结果的新对象。
从技术上讲,这是通过__IADD__
首先查找来实现的,如果未实现,则__ADD__
尝试并最后__RADD__
。
当在不确定确切类型的变量上使用python中的+ =时,需要特别小心,尤其是在不确定不确定类型是否可变的情况下。例如,考虑以下代码。
def dostuff(a):
b = a
a += (3,4)
print(repr(a)+' '+repr(b))
dostuff((1,2))
dostuff([1,2])
当我们使用一个元组调用dostuff时,该元组将被复制为+ =操作的一部分,因此b不受影响。但是,当我们使用列表调用它时,列表会被修改,因此a和b都会受到影响。
在python 3中,“ bytes”和“ bytearray”类型的行为类似。
最后请注意,即使未替换对象,也会发生重新分配。如果左侧只是一个变量,这无关紧要,但是当您有一个引用可变集合的不可变集合时,它可能引起混乱的行为,例如:
a = ([1,2],[3,4])
a[0] += [5]
在这种情况下,[5]将成功添加到a [0]引用的列表中,但是此后,当代码尝试重新分配a [0]失败时,将引发异常。
我看到很多使用+ =并带有多个整数的答案。
一个例子:
x -= 1 + 3
这类似于:
x = x - (1 + 3)
并不是:
x = (x - 1) + 3
object.__iadd__