在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], [], [], [], [], [], [], [], [], []]
此文对此有详细讨论
(还没人喜欢)
2条留言 跳到评论框
我的手机里装了Python Ped,以后可以直接在手机上编译Python程序了。Python这样的自由性,真的无时不令人惊喜呀
[回复这条留言]
哈哈,的确很有意思,我还没用过+=到list上呢,原来这么诡异~
不过有个问题,a[42:] 或 a[:33] ,这里头42,33 有啥特殊含义吗?
[回复这条留言]
没阿,你换成任何正整数都行,就相当于a[:],所以诡异啊
[回复这条留言]
这样啊,比我理解的更诡异,呵呵
[回复这条留言]