平行赋值
* 运算符在python3中被扩展到了平行赋值:1
2
3
4a,b, *c = range(5)
c
[2,3,4]
这在python2中是不被允许的
元组不再可以作为函数的参数
在python2中,可以把元素作为参数放到函数的声明中:1
2
3
4
5>>> def test(a,(b,c),d):
... print b,c
...
>>> test(1,(2,3),4)
2 3
但python3不再支持这种方式:1
2
3
4
5>>> def test(a,(b,c),d):
File "<stdin>", line 1
def test(a,(b,c),d):
^
SyntaxError: invalid syntax
一个诡异的+=谜题
1 | >>> t = (1, 2, [20, 30]) |
答案是d,程序会像预期的那样报错,但却完成了赋值的操作。1
2
3
4
5Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(1, 2, [20,30,40,50])
原因在于t[2]是个变量的引用,+=操作会让list的操作正常的完成,但给元素赋值的操作会发生异常,这并不是一个原子操作,因而出现了这种结果。可以这么理解:1
2
3>>> b = [20,30]
>>> t = (1, 2, b)
>>> t[2] += [40,50]
对b的操作会反应到t当中,但是没有赋值操作。