Python语言的诡异特性

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条留言 跳到评论框

  1. 发表于February 2, 2010 10:33 PM | 永久链接

    我的手机里装了Python Ped,以后可以直接在手机上编译Python程序了。Python这样的自由性,真的无时不令人惊喜呀

    [回复这条留言]

  2. Tao
    发表于February 7, 2010 9:53 PM | 永久链接

    哈哈,的确很有意思,我还没用过+=到list上呢,原来这么诡异~

    不过有个问题,a[42:] 或 a[:33] ,这里头42,33 有啥特殊含义吗?

    [回复这条留言]

    azalea

    回复于February 8, 2010 5:29 PM

    没阿,你换成任何正整数都行,就相当于a[:],所以诡异啊

    [回复这条留言]

    Tao

    回复于February 8, 2010 6:49 PM

    这样啊,比我理解的更诡异,呵呵

    [回复这条留言]

发表新留言

*
*