我正在手动实现几个列表方法,如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]
是解决问题的更好方法。
答案 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]
>>>
分配给新引用。引用的引用现在是通过组合(而不是变异)x
和x
列表而创建的新列表对象。因此,[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)