Python map()列表维护对子列表元素的引用

Python map()列表维护对子列表元素的引用,python,list,dictionary,Python,List,Dictionary,我被告知map()非常快(),所以我尝试使用它来复制列表列表,而不考虑易变性,我在每个子列表上调用tuple,如下所示: sheet = [['a','a','a'], ['a','a','a'], ['a','a','a'], ['a','a','a'], ['a','a','a']] newsheet1 = map(tuple,sheet) 但发现地图对象保留对原始图纸子列表元素的引用,可通过更改图纸中的值来证明,更

我被告知map()非常快(),所以我尝试使用它来复制列表列表,而不考虑易变性,我在每个子列表上调用tuple,如下所示:

sheet = [['a','a','a'],
         ['a','a','a'],
         ['a','a','a'],
         ['a','a','a'],
         ['a','a','a']]

newsheet1 = map(tuple,sheet)
但发现地图对象保留对原始图纸子列表元素的引用,可通过更改图纸中的值来证明,更改将反映在地图对象中:

sheet[0][0] = 'CHANGED'

for r in newsheet1:
    print (r)
印刷品:

('CHANGED', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
所以我试着用列表理解来复制:

newsheet2 = [tuple(row) for row in sheet]

sheet[0][0] = 'CHANGED'

print (newsheet2[0])
印刷品:

('CHANGED', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
('a', 'a', 'a')
因此,列表理解不会保留原始元素引用,但它是否比使用map()慢得多?如果map()速度更快的话,我是否可以在这里使用它而不维护引用


我想我的问题可以归结为复制列表的最快方法

区别在于
map
是在Python3.x中惰性地计算的。它保留了对要应用的函数(
tuple
)的引用,以及将其应用于(
newsheet1
)的每个项目的顺序,但在您对其进行迭代之前,它实际上不会做任何事情。如果您想立即计算它,您可以使用它,例如,
list(map(…)
但是,根据,列表理解是首选的。@jonrsharpe我明白了,所以列表理解在这种情况下会更好,谢谢列表理解更像pythonic您如何分配元组的索引<代码>工作表[0][0]=“已更改”失败,出现
类型错误
@jornsharpe-hmm,是的,这是公平的,我没有想到他们可能实际上将这件事称为
map
。我删除了注释,因为它只是让人困惑。区别在于
map
是在Python3.x中惰性地进行计算的。它保留了对要应用的函数(
tuple
)的引用,以及将其应用于(
newsheet1
)的每个项目的顺序,但在您对其进行迭代之前,它实际上不会做任何事情。如果您想立即计算它,您可以使用它,例如,
list(map(…)
但是,根据,列表理解是首选的。@jonrsharpe我明白了,所以列表理解在这种情况下会更好,谢谢列表理解更像pythonic您如何分配元组的索引<代码>工作表[0][0]=“已更改”失败,出现
类型错误
@jornsharpe-hmm,是的,这是公平的,我没有想到他们可能实际上将这件事称为
map
。我已经删除了这个评论,因为它只是让人困惑。