Python: a += b not the same as a = a + b
Possible Duplicate:
What does plus equals (+=) do in Python?
今天我发现了一个关于Python语言的有趣的"特性",这让我非常难过。
1 2 3 4 5 6 7 | >>> a = [1, 2, 3] >>> b ="lol" >>> a = a + b TypeError: can only concatenate list (not"str") to list >>> a += b >>> a [1, 2, 3, 'l', 'o', 'l'] |
这是怎么回事?我以为这两个是对等的!更糟糕的是,这是我花了很多时间调试的代码
1 2 3 4 5 6 7 | >>> a = [1, 2, 3] >>> b = {'omg': 'noob', 'wtf' : 'bbq'} >>> a = a + b TypeError: can only concatenate list (not"dict") to list >>> a += b >>> a [1, 2, 3, 'omg', 'wtf'] |
世界跆拳道联盟!我的代码中有列表和dict,我想知道我到底是怎么在不调用.keys()的情况下将dict的键添加到列表中的。事实证明,就是这样。
我认为这两个说法是对等的。即使忽略了这一点,我也能理解您将字符串附加到列表(因为字符串只是字符数组)中的方式,但是字典呢?如果它附加了一个(键、值)元组的列表,但是只获取要添加到列表中的键似乎是完全任意的。
有人知道这背后的逻辑吗?
这通常是和一直以来都是易变性的问题,特别是运算符重载。C++没有更好的。
表达式
声明
讨论:
如果一个对象没有实现
在其他语言中,您可能会使用更明显的符号。例如,在没有运算符重载的假设版本python中,您可能会看到:
1 | a = concat(a, b) |
对战
1 | a.extend(a, b) |
运算符符号实际上只是这些符号的简写。
奖金:
也可以和其他的iTerables一起尝试。
1 2 3 4 5 6 7 8 9 | >>> a = [1,2,3] >>> b ="abc" >>> a + b Traceback (most recent call last): File"<stdin>", line 1, in <module> TypeError: can only concatenate list (not"str") to list >>> a += b >>> a [1, 2, 3, 'a', 'b', 'c'] |
这样做很有用,因为您可以使用
这背后的原因是因为python列表(在您的例子中是
下面的代码片段更好地说明了这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyDict(dict): def __iter__(self): print"__iter__ was called" return super(MyDict, self).__iter__() class MyList(list): def __iadd__(self, other): print"__iadd__ was called" return super(MyList, self).__iadd__(other) a = MyList(['a', 'b', 'c']) b = MyDict((('d1', 1), ('d2', 2), ('d3', 3))) a += b print a |
结果是:
1 2 3 | __iadd__ was called __iter__ was called ['a', 'b', 'c', 'd2', 'd3', 'd1'] |
python解释器检查一个对象是否实现了