gpt4 book ai didi

python - 为什么 reverse() 在列表的特定片段上不起作用?

转载 作者:行者123 更新时间:2023-12-04 16:37:06 31 4
gpt4 key购买 nike

我有一个列表,a = [0,1,2,3,4,5]

我正在尝试使用 a[1:4].reverse() 反转切片 a[1:4]。但是,a 的值不会改变。为什么会这样?

注意:我不想知道如何进行这项工作 - 而是,为什么会发生这种情况。

最佳答案

使用 list 的小监视器包装器(子类)可能最容易看到:

class ListWrapper(list):
def __setitem__(self, key, value):
print(f'__setitem__ was called on {id(self)}')
super(ListWrapper, self).__setitem__(key, value)

def __getitem__(self, item):
print(f'Get Item was called on {id(self)}')
n = ListWrapper(super(ListWrapper, self).__getitem__(item))
print(f'New id is {id(n)}')
return n

def reverse(self):
print(f'Reversed Called on {id(self)}')
super(ListWrapper, self).reverse()

本质上,ListWrapper 在此操作中使用的方法中包含了一些打印语句:

a = ListWrapper([0, 1, 2, 3, 4, 5])
print('ID of `a` is', id(a))
a[1:4].reverse()
print('ID of `a` is', id(a))

其输出为:

ID of `a` is 2002062741728
__getitem__ was called on 2002062741728
New id is 2002062745088 # Notice the ID is different
reverse called on 2002062745088 # Reverse is called on this new object
ID of `a` is 2002062741728 # The id of `a` has not changed

我们无法访问 ID 为 2002062745088 的值,因为我们在任何地方都没有包含此信息的变量。


回应评论中的一个问题:“如果是这样,那为什么 a[1:4] = [3,2,1] 会改变 a 的值?”

让我们再看看那个操作:

a = ListWrapper([0, 1, 2, 3, 4, 5])
print('ID of `a` is', id(a))
a[1:4] = [3, 2, 1]
print('ID of `a` is', id(a))

其输出为:

ID of `a` is 2760760102160
__setitem__ was called on 2760760102160
ID of `a` is 2760760102160

请注意 a 始终具有相同的 id。并且上一个示例中的函数都没有被调用(__getitem__reverse)。因此,更新发生在列表 a 上,它的结果是可访问的。

关于python - 为什么 reverse() 在列表的特定片段上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68554249/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com