Python将列表中的列表乘以10,并在实现哈希表时得到不同的结果
嘿,伙计们,我试着用Python实现一个简单的哈希表,我只是好奇为什么这不起作用,所以当我初始化map变量时,我第一次使用这个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
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,看看是否与前面的代码示例类似
参考文献:
谢谢