繁体   English   中英

重写函数以返回变异列表

[英]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]

即使你实际上并没有改变它。 这是因为l1l的“浅”副本,这意味着它指向 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM