这两种列表创建方法有什么区别

时间:2020-01-04 05:08:38

标签: python-3.7

我正在尝试解决leetcode问题6,遇到了我无法理解的问题。问题是让我使用Z字形模式逐列重新排列字符串,并逐行输出。在我的函数中,我使用了两种不同的方法来创建存储输出的初始列表。但是,其中一个有效,而另一个无效。有人可以帮助我了解为什么会这样吗?这是我用来初始化下面列表的方法。由于要输出多个行,并且我想跟踪哪一行包含哪个字母,因此我认为我可以创建一个包含多个子列表的列表。第一种方法工作得很好,但是第二种方法无法区分哪个子列表包含哪个子列表字母并在迭代后附加整个字符串。

zigzag = [[] for x in range(n)]
zigzag = [[]]*n


for crct in l:
   zigzag[row].append(crct)

这是第一种方法的输出:[['P','I','N'],['A','L','S','I','G'],[' Y','A','H','R'],['P','I']]

第二个输出:[['P','A','Y','P','A','L','I','S','H','I ','R','I','N','G'],['P','A','Y','P','A','L','I','S ','H','I','R','I','N','G'],['P','A','Y','P','A','L ','I','S','H','I','R','I','N','G'],['P','A','Y','P ','A','L','I','S','H','I','R','I','N','G']]

1 个答案:

答案 0 :(得分:0)

在执行操作时, zigzag = [[x for range(n)中的x]] ,python创建了 n 个列表的不同实例。因此,当您执行追加操作时,它会按预期工作。

但是在 zigzag = [[]] * n 的情况下,python仅创建 一个 实例,然后您要python创建该副本的 n ,这就是外部列表的每个索引包含与指向相同引用的元素完全相同的原因。


有关更多说明,请检查以下代码段的输出。

zigzag = [[]]*5
print([id(i) for i in zigzag])
Output: [4606230920, 4606230920, 4606230920, 4606230920, 4606230920] # Same address

zigzag = [[] for x in range(5)]
print([id(i) for i in zigzag])
Output: [4606232136, 4606183048, 4606167304, 4606231240, 4606230792] # Different addresses