首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重写一个函数以返回一个变异列表

重写一个函数以返回一个变异列表
EN

Stack Overflow用户
提问于 2022-04-27 09:52:40
回答 1查看 74关注 0票数 -2

(我必须重写代码才能返回一个变异列表

函数的原始代码

代码语言:javascript
运行
复制
def times(l, n) :
    l_original = l
    
    for i in range(2, n+1) :
        l_original = l + l_original
    
    return l_original

我试图使它变异:

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2022-04-27 10:50:37

首先,在Python中,变异或返回是很好的实践,但不是两者兼而有之。也就是说,删除return是正确的。

其次,这里的问题是如何使用extend,它与l1一起对列表进行变异,后者是原始列表的副本。

如果运行代码并在循环中打印l1以进行调试:

代码语言:javascript
运行
复制
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发生了如下变化:

代码语言:javascript
运行
复制
[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的“浅”副本,这意味着它指向内存中相同的位置。因此,您在l上所做的任何更改也将出现在l1中。

为什么在原始代码中没有发生这种情况?因为l_original = l + l_original创建了一个新的列表,并且存储在局部变量l_original中,而扩展、追加等内置函数则对对象进行了变异。

我建议你看看thisthisthisthis

此外,一个简单的解决方案是使用copy.deepcopy,它基本上复制l的内容并将其存储在一个新的内存空间中,如下所示:

代码语言:javascript
运行
复制
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)

产出:

代码语言:javascript
运行
复制
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72026725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档