如何在python中使用函数(返回值)更新列表
我正在手动实现一些列表方法,如append()、insert()等。我试图在列表末尾添加元素(如append方法)。这是我正在使用的工作代码:如何在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
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]
?这至少避免了一些暂时的问题