首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python嵌套列表条目不希望与父列表共享内存地址

Python嵌套列表条目不希望与父列表共享内存地址
EN

Stack Overflow用户
提问于 2019-11-03 21:03:27
回答 1查看 198关注 0票数 1

我在Python中遇到了一个奇怪的问题,我不太明白。我使用嵌套列表(特别是一个包含两个列表的自定义列表类型对象,以便允许名为“SuperList”的负索引值)来模拟3D数组功能,以便为我正在做的小罗格利埃组织块对象。基本上,利兹。listz和listz应该是list对象,listzx应该是块对象。(最初确定为None,然后覆盖)

问题是:当输入的值是list-2-4时,所有东西都有自己的地址,但只要x增加1到-3,(所以列表2-3),listz和listzx就会突然指向完全相同的内存地址。我搞不懂为什么。显然,我不希望列表中的单元格的值具有与列表本身相同的地址,但对于为什么会发生这种情况,我不太清楚。下面是有问题的代码:(这是一个函数,它是世界对象的一个较小的部分,它将self.chunk作为包含的SuperList对象。)

代码语言:javascript
复制
def chunk_init(self):
        print ("World initialize")
        if self.chunk[0] == None:
            for zchunk in range(-self.z_range,self.z_range):
                    self.chunk[zchunk] = SuperList()
                    for ychunk in range(-self.y_range,self.y_range):
                        self.chunk[zchunk][ychunk] = SuperList()
                        for xchunk in range(-self.x_range,self.x_range):
                            chnk = self.generate_blank_chunk()
                            self.chunk[zchunk][ychunk][xchunk]= chnk
return

为了更好地衡量,下面是SuperList对象的代码:

代码语言:javascript
复制
class SuperList():
    '''
    List type object that allows for negative values that also allows you
    to index into unappended values without throwing an error. Undefined values
    are set to None.
    '''

    def __init__(self, list_plus=[], list_minus=[]):
        self.list_plus = list_plus
        self.list_minus = list_minus

    def __setitem__(self,key,value):
        if key < 0:
            key = abs(key)
            if len(self.list_minus) < key+1:
                for i in range((key+1)-len(self.list_minus)):
                    self.list_minus.append(None)
                self.list_minus[key]=value
            else:
                self.list_minus[key]=value
        else:
            if len(self.list_plus) < key+1:
                for i in range((key+1)-len(self.list_plus)):
                    self.list_plus.append(None)
                self.list_plus[key]=value
            else:
                self.list_plus[key]=value
        return

    def __getitem__(self,key):
        if key < 0:
            key = abs(key)
            if len(self.list_minus) < key+1:
                for i in range((key+1)-len(self.list_minus)):
                    self.list_minus.append(None)
                self.list_minus[key]=None
                value = self.list_minus[key]
            else:
                value = self.list_minus[key]
        else:
            if len(self.list_plus) < key+1:
                for i in range((key+1)-len(self.list_plus)):
                    self.list_plus.append(None)
                self.list_plus[key]=None
                value = self.list_plus[key]
            else:
                value = self.list_plus[key]
        return value

如果有人能解释一下为什么会发生这种情况,我将非常感激。如果单元格最终共享与它们所在的列表相同的地址,则嵌套列表无法工作,因为两个单元格都设置为相同的值,并且在应该引用SuperLists时突然引用块。再次感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-03 21:06:59

这是因为您在参数中定义了可变的默认值。这将导致您定义为参数的可变列表在每次创建SuperList实例时被重用,从而导致您正在目睹的行为。您可以阅读更多关于这个这里的内容。

代码语言:javascript
复制
def __init__(self, list_plus=[], list_minus=[]):
    self.list_plus = list_plus
    self.list_minus = list_minus

你需要把它改成这样的东西。

代码语言:javascript
复制
def __init__(self, list_plus=None, list_minus=None):
    self.list_plus = list_plus or []
    self.list_minus = list_minus or []

这样,每次创建类的新实例时,列表都会被重新初始化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58684601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档