gpt4 book ai didi

python - 列表、整数和字符串等对象的值存储在哪里?

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:30 26 4
gpt4 key购买 nike

好吧,所以所有列表都有 __setitem____getitem__ 并且整数有 __add__ __sub__ 等等来操作它们值(value)。但是这个值实际存储在哪里/我如何引用它?假设我想制作一个模仿列表的类。它可能看起来像这样

class Memory(object):
def __init__(self):
self.data = []
def __getitem__(self, i):
return self.data[i]
def __setitem__(self, key, item):
self.data[key] = item

这不是很有效,我很可能不得不单独编写类的每个方法,这可能跨越多个类的数百行。

将类创建为列表的子类的下一个最佳解决方案如下:

class Memory(list):
...

但是您不能编辑它的任何方法,因为您不能引用它的值。如果你改变它的 __setitem__()我想做的是创建一个列表类,这样我就可以在一个 lambda 上设置列表和执行其他操作值。我不能只是简单地直接调用 __setitem__(key,item) 因为你不能输入列表中已经存在的项目范围之外的键。如何在不调用其 __setitem__() 方法的情况下编辑列表的值。

最佳答案

我意识到这并没有直接回答你关于“值(value)……存储在哪里”的问题,我不确定你所说的“我不能直接调用 __setitem__(key ,item) 因为你不能输入列表中已经存在的项目范围之外的键,”但是如果我理解正确的话,你只需要在你想要的值之间“填写”值要设置和当前长度。

例如,我有一个实用程序类,我有时会用它来执行此操作。 (查看底部的测试用例了解我如何使用它。)

class DynamicArray(list):
''' Just like a normal list except you can skip indices when you fill it. '''

def __init__(self, defaultVal = None, startingCapacity = 0):
super(DynamicArray, self).__init__()
self.defaultVal = defaultVal
if (startingCapacity > 0):
self += [ defaultVal ] * startingCapacity


def insert(self, ind, val):
if (ind > len(self)):
for i in xrange(len(self), ind):
self.append(self.defaultVal)
super(DynamicArray, self).insert(ind, val)


def set(self, ind, val):
self[ind] = val


def __setitem__(self, ind, val):
if (ind >= len(self)):
for i in xrange(len(self), ind + 1):
self.append(self.defaultVal)
super(DynamicArray, self).__setitem__(ind, val)



if __name__ == "__main__":
a = DynamicArray()
assert(len(a) == 0)
a[3] = 2
assert(a[3] == 2)
assert(a[0] is None and a[1] is None and a[2] is None)
assert(len(a) == 4)
a[1] = 1
assert(a[1] == 1)
assert(a[3] == 2)
assert(a[0] is None and a[2] is None)
assert(len(a) == 4)
a[5] = 7
assert(a[5] == 7)
assert(a[3] == 2)
assert(a[1] == 1)
assert(a[0] is None and a[2] is None)
assert(len(a) == 6)

关于python - 列表、整数和字符串等对象的值存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493846/

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