Think Python Exercise 10.4

编写一个叫做 chop 的函数,接受一个列表作为参数,移除第一个和最后一个元素,并返回None。例如:

>>> t = [1, 2, 3, 4]
>>> chop(t)
>>> t
[2, 3]

分析:

一顿操作猛如虎:(错的)

1
2
3
4
5
6
7
8
def chop(t):
    t = t[1:-1]

t1 = [1, 2, 3, 4]

chop(t1)

t1

为什么t1没变化?是我列表切片用错了吗,再试试:(还是错的)

1
2
3
4
5
6
7
8
def chop(t):
    t = t[1:len(t)-2]

t1 = [1, 2, 3, 4]

chop(t1)

t1

可以看到,t1还是没变化,为什么?为什么这样是错的?

不要被迷惑了,当一个列表t1传递给一个函数时,t1和形参t共同指向同一个列表,但当函数内部t重新赋值后,t指向了一个新的列表,而t1依然指向原来的列表,那么当函数运行结束后,t1的值当然还是原来的啦。

由于题目要求函数不能有返回值,可以使用下面的做法:

1
2
3
4
5
6
7
8
9
def chop(t):
    del t[0]
    del t[-1]

t1 = [1, 2, 3, 4]

chop(t1)

t1

如果函数可以有返回值,可以这样写:

1
2
3
4
5
6
7
8
def chop(t):
    return t[1:-1]

t1 = [1, 2, 3, 4]

t1 = chop(t1)

t1