Sal*_*olo 103 python operators notation shorthand compound-assignment
我需要知道python中的+ =做了什么.就这么简单.我也很感激链接到python中其他简写工具的定义.
小智 130
在Python中,+ =是糖涂层的__iadd__特殊方法,__add__或者__radd__如果__iadd__不存在.__iadd__类的方法可以做任何想做的事情.list对象实现它并使用它迭代一个可迭代对象,将每个元素附加到自身,其方式与list的extend方法相同.
这是一个实现__iadd__特殊方法的简单自定义类.使用int初始化对象,然后可以使用+ =运算符添加数字.我添加了一个print语句__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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
Imr*_*ran 113
+= 使用变量的值添加另一个值,并将新值分配给变量.
>>> x = 3
>>> x += 2
>>> print x
5
Run Code Online (Sandbox Code Playgroud)
-=,*=,/=做减法,乘法和除法类似.
Ros*_*hta 31
x += 5与x = x + 5Python中的说法不完全相同.
请注意:
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]
Run Code Online (Sandbox Code Playgroud)
Rya*_*igg 28
+=在变量中添加一个数字,在过程中改变变量本身(而+不是).与此类似,还有以下内容也修改变量:
-=,从变量中减去一个值,将变量设置为结果*=,将变量和值相乘,使结果成为变量/=,将变量除以值,使结果成为变量%=,对变量执行模数,然后将变量设置为变量的结果可能还有其他人.我不是Python程序员.
C S*_*C S 14
它不仅仅是一种语法快捷方式.试试这个:
x=[] # empty list
x += "something" # iterates over the string and appends to list
print(x) # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
Run Code Online (Sandbox Code Playgroud)
与
x=[] # empty list
x = x + "something" # TypeError: can only concatenate list (not "str") to list
Run Code Online (Sandbox Code Playgroud)
这说明+ =调用iadd列表方法,但是+调用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])
Run Code Online (Sandbox Code Playgroud)
当我们用元组调用dostuff时,元组被复制为+ =操作的一部分,因此b不受影响.但是,当我们使用列表调用它时,列表会在适当的位置进行修改,因此a和b都会受到影响.
在python 3中,使用"bytes"和"bytearray"类型观察到类似的行为.
最后请注意,即使未替换对象,也会发生重新分配.如果左侧只是一个变量,这并不重要,但如果您有一个引用可变集合的不可变集合,它可能会导致令人困惑的行为,例如:
a = ([1,2],[3,4])
a[0] += [5]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,[5]将成功添加到[0]引用的列表中,但之后在代码尝试时将引发异常,并且无法重新分配[0].
注意x += y与x = x + y包含附加运算符的某些情况不同,因为运算符优先级与右侧总是首先计算的事实相结合,例如
>>> x = 2
>>> x += 2 and 1
>>> x
3
>>> x = 2
>>> x = x + 2 and 1
>>> x
1
Run Code Online (Sandbox Code Playgroud)
注意第一种情况扩展为:
>>> x = 2
>>> x = x + (2 and 1)
>>> x
3
Run Code Online (Sandbox Code Playgroud)
您更有可能在“现实世界”中与其他运营商遇到这种情况,例如
x *= 2 + 1== x = x * (2 + 1)!=x = x * 2 + 1
| 归档时间: |
|
| 查看次数: |
504310 次 |
| 最近记录: |