乐趣区

关于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, 3
a = [[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)]​​ 会更好。

以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注 Python 技术大本营,获取更多技能与教程。

退出移动版