如何在python中使用函数(带返回值)更新列表

时间:2017-07-18 00:13:45

标签: python list python-3.x

我正在手动实现几个列表方法,如append(),insert()等。我试图在列表末尾添加元素(如append方法)。这是我正在使用的工作代码:

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]是解决问题的更好方法。

5 个答案:

答案 0 :(得分:1)

x += [item]x = x + [item]没有什么区别。在第一种情况下,您要求对x引用的列表进行更改;这就是结果反映出变化的原因。在第二个中,您要求x引用一个新列表,即通过合并x的原始值和[item]制作的列表。请注意,更改x,这就是您的结果未更改的原因。

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

答案 1 :(得分:1)

您可以使用insert指定列表的一部分来实现list.insert w / o:

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

这将使用新列表替换x引用的对象的内容。无需返回它,因为它是就地执行的。

答案 2 :(得分:0)

在您的第一个示例中, 变异 (a.k.a已更改)view.click() # starts a new activity ViewClient.sleep(5) # wait for it to start activityName = magic.getActivityName() activityPackage = magic.getActivityPackage() 引用的列表对象。当Python看到x时,它将其转换为:

x += [item]

正如您所看到的,我们通过调用它的重载就地运算符函数x.__iadd__([item]) 来改变x引用的列表对象。如前所述,__iadd__会改变现有的列表对象:

__iadd__()

在第二个示例中,您要求Python将>>> lst = [1, 2] >>> lst.__iadd__([3]) [1, 2, 3] >>> lst [1, 2, 3] >>> 分配给新引用。引用的引用现在是通过组合(而不是变异)xx列表而创建的新列表对象。因此,[item]从未改变过。

当Python看到x时,它可以转换为:

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也是如此。

答案 3 :(得分:-1)

class DerivedList(list):
    def insertAtLastLocation(self,obj):
        self.__iadd__([obj])        

parameter=[1,1,1]
lst=DerivedList(parameter)
print(lst)   #output[1,1,1]
lst.insertAtLastLocation(5)
print(lst)   #output[1,1,1,5]
lst.insertAtLastLocation(6)
print(lst)   #output[1,1,1,5,6]

您可以使用此代码在列表的最后位置添加一个元素

class DerivedList(list):
    def insertAtLastLocation(self,*obj):
        self.__iadd__([*obj])

parameter=[1,1,1]
lst=DerivedList(parameter)
print(lst)    #output[1,1,1]
lst.insertAtLastLocation(5)
print(lst)     #output[1,1,1,5]
lst.insertAtLastLocation(6,7)
print(lst)    #output[1,1,1,5,6,7]
lst.insertAtLastLocation(6,7,8,9,10)
print(lst)   #output[1,1,1,5,6,7,8,9,10]

此代码可以在最后一个位置添加多个项目

答案 4 :(得分:-2)

问题是你没有抓住你返回的结果。某些操作(例如+=)会修改原始列表;其他人(例如x = x + item)评估新列表并重新分配局部变量x

请特别注意x <{1}}; arr仅仅是一个局部变量。要将返回的值转换为x,您必须分配它:

arr

arr = push(arr, 7)