关于数组:在python中初始化哈希表时,这行代码做了什么?

What does this line of code do when initializing a hash table in python?

本问题已经有最佳答案,请猛点这里访问。

我正在研究如何在python中创建哈希表的解决方案,并遇到了这个函数:

1
2
3
def __init__(self, size):
    self.size = size
    self.table = [[] for _ in range(self.size)]

创建多维数组的第三行代码让我困惑。主要是这部分:

1
for _ in range(self.size)

这到底在做什么?为什么需要这样做而不只是这样做:

1
[[] self.size]

哪个可以创建一个大小为self.size的二维数组?任何一种视觉辅助手段都会有帮助。


这条线

1
self.table = [[] for _ in range(self.size)]

创建存储哈希表内容的存储桶数组。

变量名_用于表示变量不重要,其内容基本上被丢弃。这对于范围较短的未使用变量很有用,比如这个变量。

您建议初始化如下内容:

1
self.table = [[]]*self.size

但这是一个坏主意,因为你实际上得到了同一份清单的self.size份副本!即:

1
2
3
4
a=[[]]*4
>>> [[], [], [], []]
a[0].append(3)
>>> [[3], [3], [3], [3]]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> good_table = [[] for _ in range(5)]
>>> good_table
[[], [], [], [], []]
>>> good_table[0].append(3)
>>> good_table
[[3], [], [], [], []]
>>> suggested_table = [[] 5]
  File"<input>", line 1
    suggested_table = [[] 5]
                          ^
SyntaxError: invalid syntax
>>> suggested_table = [[] * 5]
>>> suggested_table
[[]]
>>> [] * 5
[]
>>> bad_table = [[]] * 5
>>> bad_table
[[], [], [], [], []]
>>> bad_table[0].append(3)
>>> bad_table
[[3], [3], [3], [3], [3]]

对于最后一部分,请参见意外地在子列表中反映的列表更改列表。