(我必须重写代码才能返回一个变异列表
函数的原始代码
def times(l, n) :
l_original = l
for i in range(2, n+1) :
l_original = l + l_original
return l_original
我试图使它变异:
def times_mut(l,n):
l1= l
for _ in range(2,n-1):
l.extend(l1)
l = [1,2,3]
times_mut(l,6)
print(l)
所以,我的想法是一遍又一遍地更改原始列表,或者如何将列表更改为一个变异列表?
预期输出应为l*n。
发布于 2022-04-27 10:50:37
首先,在Python中,变异或返回是很好的实践,但不是两者兼而有之。也就是说,删除return
是正确的。
其次,这里的问题是如何使用extend
,它与l1
一起对列表进行变异,后者是原始列表的副本。
如果运行代码并在循环中打印l1
以进行调试:
def times_mut(l,n):
l1= l
for _ in range(2,n-1):
print(l1) # debugging
l.extend(l1)
l = [1,2,3]
times_mut(l,6)
print(l)
您将看到l1
发生了如下变化:
[1, 2, 3]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
即使你并没有真正改变它。这是因为l1
是l
的“浅”副本,这意味着它指向内存中相同的位置。因此,您在l
上所做的任何更改也将出现在l1
中。
为什么在原始代码中没有发生这种情况?因为l_original = l + l_original
创建了一个新的列表,并且存储在局部变量l_original
中,而扩展、追加等内置函数则对对象进行了变异。
此外,一个简单的解决方案是使用copy.deepcopy
,它基本上复制l
的内容并将其存储在一个新的内存空间中,如下所示:
import copy
def times_mut(l,n):
l_original=copy.deepcopy(l)
for iii in range(2,n+1):
l.extend(l_original)
l = [1,2,3]
times_mut(l,6)
print(l)
产出:
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
https://stackoverflow.com/questions/72026725
复制相似问题