2017-07-18 133 views
0

我正在手动执行几个像append(),insert()等列表方法。我试图在列表的末尾添加元素(如append方法) 。这是我使用的工作代码:如何在python中用函数(带返回值)更新列表

arr = [4,5,6] 

def push(x, item): 
    x += [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6,7] 

但是,当我实现相同的代码没有什么区别。我得到不同的输出。

arr = [4,5,6] 

def push(x, item): 
    x = x + [item] 
    return x 

push(arr,7) 
print(arr)  #Output: [4,5,6] 

而且我对插入方法也是一样的。下面是插入方法的代码:

arr = [4,5,7,8] 

def insert(x, index, item): 
    x = x[:index] + [item] + x[index:] 
    return x 

insert(arr,2,6) 
print(arr)  #Output: [4,5,7,8] 

我知道我可以通过arr=insert(arr,2,6)返回值保存到列表中,但我想要一个替代的解决方案,该列表中调用函数像我的第一个代码样本中后自动获得更新。

编辑1: 我认为x[index:index] = [item]是更好的解决方案的问题。

+0

[相关](https://stackoverflow.com/questions/15376509/when-is-ix-different-from-iix-in-python) – jacoblaw

回答

1

您可以分配到一个列表的片段来实现你insert瓦特/ O使用list.insert

def insert(x, index, item): 
    x[:] = x[:index] + [item] + x[index:] 

这种替换由x用新的列表中引用的对象的内容。由于它是在原地执行的,因此无需再返回它。

+1

为什么不使用'x [index:index] = [item ]'?这避免了至少一些临时副本:) – MSeifert

1

x += [item]x = x + [item]没有什么不同。在第一种情况下,您要求更改x引用的列表;这就是为什么结果反映了这种变化。第二,你要求x引用一个新列表,这个列表通过结合x的原始值和[item]而得出。请注意,这是而不是更改x,这就是为什么你的结果不变。

另请注意,您的返回语句无关紧要,因为返回的值将被忽略。

-2

问题是你没有捕获到你返回的结果。一些操作(如+=)修改原始列表;其他人(例如x = x + item)评估新列表并重新分配本地变量x

特别注意的是,x不是绑定arr; x只是一个局部变量。为了获取返回的值转换成arr,你必须给它分配:

arr = push(arr, 7) 

arr = insert(arr, 2, 6) 
0

在你突变(又名改变)的列表对象通过x提到你的第一个例子。当Python看到x += [item]它,它翻译成:

x.__iadd__([item]) 

正如你所看到的,我们通过突变调用它通过x所指名单对象的超载就地操作功能__iadd__。前面已经说过,__iadd__()变异现有列表对象:

>>> lst = [1, 2] 
>>> lst.__iadd__([3]) 
[1, 2, 3] 
>>> lst 
[1, 2, 3] 
>>> 

在你的第二个例子,你叫Python的分配x到一个新的参考。现在引用的是通过组合(而不是变异)x[item]列表制成的新列表对象的引用者。因此,x从未改变。

当Python看到x = x + [item]可以翻译成:

x = x.__add__([item]) 

名单__add__功能不变异现有列表对象。相反,它返回通过梳理通过现有列表的值和参数做了一个新的列表到__add__()

>>> lst = [1, 2] 
>>> lst.__add__([3]) # lst is not changed. A new list is returned. 
[1, 2, 3] 
>>> 

您需要的push版本的结果返回给arr列表。 insert也是如此。