[英]rewrite a fuction to return a mutated list
嘿(:我必须重写代码以返回一个变异列表
function的原码
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)
所以我的想法是一遍又一遍地更改原始列表,或者我如何将列表更改为变异列表?
预期的 output 应该是 l*n。
首先,在 Python 中,变异或返回是一种很好的做法,但不是两者都发生。 也就是说,您删除return
是正确的。
其次,这里的问题是您如何使用extend
,它会与l1
一起改变列表, 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
的“浅”副本,这意味着它指向 memory 中的相同位置。因此,您对l
所做的任何更改也会出现在l1
中。
为什么这不会在原始代码中发生? 因为l_original = l + l_original
创建了一个新列表并存储在局部变量l_original
中,而内置函数如 extend、append 等会改变 object。
此外,一个简单的解决方案是使用copy.deepcopy
,它基本上复制l
的内容并将其存储在新的 memory 空间中,如下所示:
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)
output:
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.