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

如何在python中使用函数(返回值)更新列表,python,list,python-3.x,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

我正在手动实现一些列表方法,如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]
对于insert方法,我也面临同样的问题。以下是插入方法的代码:

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

x+=[item]
x=x+[item]
有很大区别。在第一种情况下,您要求对
x
引用的列表进行更改;这就是为什么结果反映了变化。在第二个列表中,您要求
x
引用一个新列表,该列表是通过组合
x
的原始值和
[item]
生成的。请注意,这不会改变
x
,这就是结果保持不变的原因


还请注意,返回语句是不相关的,因为返回的值被忽略。

x+=[item]
x=x+[item]
有很大区别。在第一种情况下,您要求对
x
引用的列表进行更改;这就是为什么结果反映了变化。在第二个列表中,您要求
x
引用一个新列表,该列表是通过组合
x
的原始值和
[item]
生成的。请注意,这不会改变
x
,这就是结果保持不变的原因


还请注意,返回语句是不相关的,因为返回的值被忽略。

您可以分配给列表的一部分,以使用
列表实现
插入
w/o。插入

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

这将用新列表替换
x
引用的对象的内容。无需返回它,因为它是在适当的位置执行的。

您可以指定列表的一部分,以使用
列表执行
插入
操作。插入

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

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

问题在于您没有捕获返回的结果。某些操作(如
+=
)修改原始列表;其他变量(如
x=x+item
)评估新列表并重新分配局部变量
x

特别要注意的是,
x
不绑定到
arr
x
只是一个局部变量。要将返回值放入
arr
,您必须分配它:

arr = push(arr, 7)


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

特别要注意的是,
x
不绑定到
arr
x
只是一个局部变量。要将返回值放入
arr
,您必须分配它:

arr = push(arr, 7)


在第一个示例中,您对
x
引用的列表对象进行了变异(又称更改)。当Python看到
x+=[item]
时,它将其转换为:

x.__iadd__([item])
正如您所看到的,我们通过调用它的重载就地操作符函数
\uuu iadd\uu
来改变
x
引用的列表对象。如前所述,
\uuu iadd\uuu()
对现有列表对象进行了修改:

>>> 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])
列表的
\uuuuuuuuuuuuuuuuuuuuuuuu
功能不会改变现有的列表对象。相反,它通过组合现有列表的值和传递到
\uuuuu add\uuuuu()中的参数,返回一个新列表:


您需要将
push
版本的结果返回到
arr
列表。
insert

在您的第一个示例中,您对
x
引用的列表对象进行了变异(即更改)。当Python看到
x+=[item]
时,它将其转换为:

x.__iadd__([item])
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]
正如您所看到的,我们通过调用它的重载就地操作符函数
\uuu iadd\uu
来改变
x
引用的列表对象。如前所述,
\uuu iadd\uuu()
对现有列表对象进行了修改:

>>> 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])
列表的
\uuuuuuuuuuuuuuuuuuuuuuuu
功能不会改变现有的列表对象。相反,它通过组合现有列表的值和传递到
\uuuuu add\uuuuu()中的参数,返回一个新列表:

您需要将
push
版本的结果返回到
arr
列表。这同样适用于
insert

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]
此代码可以在最后一个位置添加多个项目

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

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]

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

为什么不直接使用
x[index:index]=[item]
?这至少避免了一些暂时的问题