python3区别于python2的变化

平行赋值

* 运算符在python3中被扩展到了平行赋值:

1
2
3
4
a,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
2
3
4
5
6
7
8
>>> t = (1, 2, [20, 30])
>>> t[2] += [40,50]
请问结果会是怎样
a. t = (1, 2, [20,30,40,50])
b. 因为t是不可变量,程序报错
c. a和b都不对
d. a和b都正确

答案是d,程序会像预期的那样报错,但却完成了赋值的操作。

1
2
3
4
5
Traceback (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当中,但是没有赋值操作。