Python:正确生成列表的方法(列表生成器python)

网友投稿 505 2022-09-07


Python:正确生成列表的方法(列表生成器python)

注意:在生成列表的时候,最好用 ​​[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 = ab[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)]​​ 会更好。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python编程第一步(如何开始python编程)
下一篇:springboot使用线程池(ThreadPoolTaskExecutor)示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~