Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将列表中的列表乘以10,并在实现哈希表时得到不同的结果_Python - Fatal编程技术网

Python将列表中的列表乘以10,并在实现哈希表时得到不同的结果

Python将列表中的列表乘以10,并在实现哈希表时得到不同的结果,python,Python,嘿,伙计们,我试着用Python实现一个简单的哈希表,我只是好奇为什么这不起作用,所以当我初始化map变量时,我第一次使用这个 class HashMap: def __init__(self): self.size = 10 self.map = [[] for _ in range(10)] #What to focus on def getHash(self, key): return key % self.size

嘿,伙计们,我试着用Python实现一个简单的哈希表,我只是好奇为什么这不起作用,所以当我初始化map变量时,我第一次使用这个

class HashMap:
    def __init__(self):
        self.size = 10
        self.map = [[] for _ in range(10)] #What to focus on 

    def getHash(self, key):
        return key % self.size

    def add(self,key, value):
        #Get hashed bucket index
        bucket = self.getHash(key)
        self.map[bucket].append(value)


#To test my function. 
h = HashMap()

h.add(1, "Swag")

print(h.map)
当我这样做时,我的哈希映射工作得非常好,可以得到所需的结果:

[[], ['Swag'], [], [], [], [], [], [], [], []]
但是,当我这样做时:

self.map = [[]] * 10 #What to focus on
然后我得到这个输出:

[['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag'], ['Swag']]

有人知道为什么会这样吗?我是一个python新手,所以任何东西都会很好,谢谢

因为没有调用列表构造函数,所以没有创建任何新的列表对象。列表乘法只是复制对相同元素的引用(在本例中为单个列表)

有效的列表理解

self.map = [[] for _ in range(10)]
相当于

self.map = []
for _ in range(10):
    self.map.append([])
self.map = []
ls = [[]]
for _ in range(10):
    self.map.extend(ls)
但是
[[]]*10
大致相当于

self.map = []
for _ in range(10):
    self.map.append([])
self.map = []
ls = [[]]
for _ in range(10):
    self.map.extend(ls)

当您执行
*10
操作时,您没有复制对象,而是对同一对象进行了10次引用。如果对象是可变的,那么更改一个对象将更改所有对象。您的对象是绝对可变的列表。

使用重复操作符
*
创建列表列表创建一个列表,其中每个列表项引用相同的内存位置

注意:如果要修改这5项中的任何一项(在下面的代码示例中)。它间接地意味着更新其他项目的价值(具有相同的价值)

您可以使用id()函数打印这两种情况下列表元素的id。下面的代码示例和输出很清楚

列表理解是以最好的(Pythonic)方式处理上述问题的好方法

注意:与上述不同,我们可以轻松创建列表列表,其中每个列表项引用不同的内存位置

我们可以使用id()函数打印项目的id,看看是否与前面的代码示例类似

参考文献:

谢谢