http://azaleasays.com/2010/01/29/weird-python-features/
在Strangest language feature这篇讨论里看到的,原文让人大开眼界啊!
这里抄几个Python的:
>>> def f():
... try:
... return True
... finally:
... return False
...
>>> f()
你说结果是啥呢?
答案是False!原文的解释是:finally always wins..
>>> (10 > 5 > 1)
True
>>> ((10 > 5) > 1)
False
这个是因为Python允许连续的比较运算,所以 10>5>1 相当于 10>5 and 5>1,于是True。
而 (10>5) > 1 要先运算10>5,结果是True,True被转换成1进行比较,1>1,于是False。
在Python 2.x 里:
>>> True = False
>>> True
False
把False赋值给True,True的值就变成了False = =! 在Python 3.x 里就不能这样做了。
>>> a = "foo" "bar"
>>> a
'foobar'
在Ruby, C里ms也是这样。虽然我不知道这个特性有啥用处。
>>> a[0] = "hello"
NameError: name 'a' is not defined
>>> a[0:] = "hello"
NameError: name 'a' is not defined
>>> a = []
>>> a[0] = "hello"
IndexError: list assignment index out of range
>>> a[0:] = "hello"
>>> a
['h', 'e', 'l', 'l', 'o']
上面把 a[0:] 改成 a[:] 或 a[42:] 或 a[:33] 同样work!
今天自己遇到的:
>>> a=[0]*10
>>> a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> a[3:5] += [2]*2
>>> a
[0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0]
>>> a[3:5] += [3]*2
>>> a
[0, 0, 0, 0, 0, 3, 3, 2, 2, 0, 0, 0, 0, 0]
我没想到是这个结果,+= 相当于做了insert的事情,而不是改变list原位置elements的值
一个workarround是用numpy,把a变成array:
>>> import numpy
>>> a=numpy.zeros(10)
>>> a
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> a[3:5] += [2]*2
>>> a
array([ 0., 0., 0., 2., 2., 0., 0., 0., 0., 0.])
>>> a[3:5] += [3]*2
>>> a
array([ 0., 0., 0., 5., 5., 0., 0., 0., 0., 0.])
大家知道有啥更好的方法么?
又遇到一个:
>>> L = [0]*10
>>> L
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> L[0] += 1
>>> L
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> L = [[]]*10
>>> L
[[], [], [], [], [], [], [], [], [], []]
>>> L[0].append(1)
>>> L
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
解决方法:
>>> L = []
>>> for i in range(10):
... L.append([])
...
>>> L
[[], [], [], [], [], [], [], [], [], []]
>>> L[0].append(1)
>>> L
[[1], [], [], [], [], [], [], [], [], []]
此文对此有详细讨论
Oct 7, 2010添加:
>>> -75/2+4 -34 >>> 4-75/2 -33
解释:在-75/2+4里,Python把 -75看成个整体,然后除以2,得到-38 (向下取整)
而在4-75/2里,Python先算75/2得到37,再用4-37=-33