目录

Python还债日记之列表解析式

python中的列表解析式

python中的列表解析式

1. 列表解析式

python中的列表解析式可以帮助我们用简短的语言来创建一个列表,形如:

1
[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]

这里相当于两层循环,外加一些条件判断

1
2
3
4
5
for x in range(1,5)
    if x > 2
        for y in range(1,4)
            if y < 3
                x*y

2. 问题描述

但是今天偶尔在刷题时,想要用列表解析式创建一个列表,这里给定了第一个元素的值,然后之后每个元素都是前面元素数值的二倍,我们想要借用列表解析式的话,可能会这么写

1
[a[i-1]*2 for i in range(len(a))]

但是!!!问题就出在这里,出现的结果并不是想象的[1, 2, 4, 8, …]

1
2
3
4
>>> a = [1] * 5
>>> a[1:] = [a[i-1]*2 for i in range(len(a))]
>>> print(a)
[1, 2, 2, 2, 2, 2]

可见,列表解析式针对这种情况,应该是新建了一个对象,存储 a[i-1]的值,也就是说,这里的a[i-1]并不是我们想象的是可变的,而是一个定值!!!

所以之后要注意,此类写法应该使用普通for循环来填充a