为什么名单不变?

2024-04-20 10:01:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在有序列表中添加值,但列表不会更改:

def insert(V, x):

    if len(V)!=0:

        for i in range( 0 , len(V)-1):
            if (V[i]<=x)and(V[i+1]>=x):
                V=V[0:i+1]+[x]+V[i+1:len(V)]
                print("\nExpected: \n"+ repr(V))
                return

    V=V+[x]
    return

我有这个:

V=[1,2,3,4,5,6,7,8,9,10]
insert(V, 6)
print("\nResult: \n"+ repr(V))enter code here

结果是:

Expected: 
[1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10]

Result: 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我可以解决将V设置为return的问题,但是我希望函数在列表上工作。你知道吗


Tags: andin列表forlenreturnifdef
3条回答

您的函数不会更改V。你知道吗

V=V[0:i+1]+[x]+V[i+1:len(V)]

在这一行之后,V不再是对传递给函数的列表的引用,而是另一个列表。此行不会更改第一个列表,但会创建一个新列表。你知道吗

必须return V,然后获取结果或调用V上的方法,例如list.insert()。你知道吗

您可以将值附加到列表中,然后对其进行排序

l.append(值)

l.排序()

你所做的事情可以用list.insert简单地完成。你知道吗

至于函数不起作用的原因,需要使用完整片赋值更新原始列表,以便通过当前引用V更新传递给函数的列表:

...
V[:] = V[0:i+1] + [x] + V[i+1:len(V)]
# ^

请注意,RHS(右侧)是一个新的列表对象。单独赋给V会将名称/变量重新绑定到新的列表对象。但是,使用切片指定可确保使用新列表中的值更新原始列表。你知道吗

相关问题 更多 >