如何用Python准确构建列表结构?
- 内容介绍
- 文章标签
- 相关推荐
本文共计774个文字,预计阅读时间需要4分钟。
注意:在生成列表时,最好使用`[0 for _ in range(n)]`的格式,而不是`[0] * n`的格式。原因如下:
- 使用`[0 for _ in range(n)]`可以更清晰地表达生成列表的意图,其中`range(n)`指定了列表的长度,`for _ in range(n)`则表示对每个元素进行循环但不关心具体值。- 使用`[0] * n`虽然也能生成一个长度为n的列表,但其表达的含义是复制第一个元素(即0)n次,这可能会导致误解。
假设我们想要创建一个长度为n的列表a,我们可以使用以下代码:
pythonn=2a=[0 for _ in range(n)]
这样,列表a将包含两个元素,都是0。
注意:在生成列表的时候,最好用 [0 for _ in range(n)] 的方式而不是 [0] * n 的方式生成,原因如下。
假设我们想要创建一个长度为 n = 2 列表 a 的时候,一般的做法有两种:a = [0] * n 和 a = [0 for _ in range(n)],在一维的时候两种方法没有区别。但是如果我们想要创建一个列表,列表中的每个元素都是长度为 m = 3 的列表时用两种方法出来的结果就是不同的:
n, m = 2, 3a = [[0] * n] * m # 用第一种方法生成的
# a = [[0, 0], [0, 0], [0, 0]]
b = [[0 for _ in range(n)] for _ in range(m)] # 用第二种方法生成的
# b = [[0, 0], [0, 0], [0, 0]]
a[0][0] = 1 # 令 a 列表的第一个元素为 1
# a = [[1, 0], [1, 0], [1, 0]]
b[0][0] = 1
# b = [[1, 0], [0, 0], [0, 0]]
我们的预期结果是像 b 这样的,也就是第一个列表的第一个元素等于 1,但是列表 a 是将每一个列表的第一个元素都设为 1 了。
导致这种情况的原因在于,用第一种生成方法是类似于 = 的方式去生成的,也就是假设 a, b 都是列表,我们令 a = b ,如果他们其中一个的元素改变了,另一个也会跟着变,例如:
a = [0, 0, 0]b = a
b[0] = 1
# a = [1, 0, 0]
# b = [1, 0, 0]
要想避免这样的情况,就应该这样写 b = list(a).
回到一开始的问题,如果用第一种方法 a = [[0] * n] * m,那么 a 中的 m 个列表存储的地址都是一样的,那么你改变其中的一个列表,其他的列表都会跟着改变,就会出现上面的情况。
c = [[0] * n for _ in range(m)] # 没问题d = [[0 for _ in range(n)]] * m # 有问题
所以,以后要生成的列表时候,一律用 [0 for _ in range(n)] 会更好。
本文共计774个文字,预计阅读时间需要4分钟。
注意:在生成列表时,最好使用`[0 for _ in range(n)]`的格式,而不是`[0] * n`的格式。原因如下:
- 使用`[0 for _ in range(n)]`可以更清晰地表达生成列表的意图,其中`range(n)`指定了列表的长度,`for _ in range(n)`则表示对每个元素进行循环但不关心具体值。- 使用`[0] * n`虽然也能生成一个长度为n的列表,但其表达的含义是复制第一个元素(即0)n次,这可能会导致误解。
假设我们想要创建一个长度为n的列表a,我们可以使用以下代码:
pythonn=2a=[0 for _ in range(n)]
这样,列表a将包含两个元素,都是0。
注意:在生成列表的时候,最好用 [0 for _ in range(n)] 的方式而不是 [0] * n 的方式生成,原因如下。
假设我们想要创建一个长度为 n = 2 列表 a 的时候,一般的做法有两种:a = [0] * n 和 a = [0 for _ in range(n)],在一维的时候两种方法没有区别。但是如果我们想要创建一个列表,列表中的每个元素都是长度为 m = 3 的列表时用两种方法出来的结果就是不同的:
n, m = 2, 3a = [[0] * n] * m # 用第一种方法生成的
# a = [[0, 0], [0, 0], [0, 0]]
b = [[0 for _ in range(n)] for _ in range(m)] # 用第二种方法生成的
# b = [[0, 0], [0, 0], [0, 0]]
a[0][0] = 1 # 令 a 列表的第一个元素为 1
# a = [[1, 0], [1, 0], [1, 0]]
b[0][0] = 1
# b = [[1, 0], [0, 0], [0, 0]]
我们的预期结果是像 b 这样的,也就是第一个列表的第一个元素等于 1,但是列表 a 是将每一个列表的第一个元素都设为 1 了。
导致这种情况的原因在于,用第一种生成方法是类似于 = 的方式去生成的,也就是假设 a, b 都是列表,我们令 a = b ,如果他们其中一个的元素改变了,另一个也会跟着变,例如:
a = [0, 0, 0]b = a
b[0] = 1
# a = [1, 0, 0]
# b = [1, 0, 0]
要想避免这样的情况,就应该这样写 b = list(a).
回到一开始的问题,如果用第一种方法 a = [[0] * n] * m,那么 a 中的 m 个列表存储的地址都是一样的,那么你改变其中的一个列表,其他的列表都会跟着改变,就会出现上面的情况。
c = [[0] * n for _ in range(m)] # 没问题d = [[0 for _ in range(n)]] * m # 有问题
所以,以后要生成的列表时候,一律用 [0 for _ in range(n)] 会更好。

