我在Python中遇到了一个奇怪的问题,我不太明白。我使用嵌套列表(特别是一个包含两个列表的自定义列表类型对象,以便允许名为“SuperList”的负索引值)来模拟3D数组功能,以便为我正在做的小罗格利埃组织块对象。基本上,利兹。listz和listz应该是list对象,listzx应该是块对象。(最初确定为None,然后覆盖)
问题是:当输入的值是list-2-4时,所有东西都有自己的地址,但只要x增加1到-3,(所以列表2-3),listz和listzx就会突然指向完全相同的内存地址。我搞不懂为什么。显然,我不希望列表中的单元格的值具有与列表本身相同的地址,但对于为什么会发生这种情况,我不太清楚。下面是有问题的代码:(这是一个函数,它是世界对象的一个较小的部分,它将self.chunk作为包含的SuperList对象。)
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对象的代码:
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时突然引用块。再次感谢。
发布于 2019-11-03 21:06:59
这是因为您在参数中定义了可变的默认值。这将导致您定义为参数的可变列表在每次创建SuperList实例时被重用,从而导致您正在目睹的行为。您可以阅读更多关于这个这里的内容。
def __init__(self, list_plus=[], list_minus=[]):
self.list_plus = list_plus
self.list_minus = list_minus你需要把它改成这样的东西。
def __init__(self, list_plus=None, list_minus=None):
self.list_plus = list_plus or []
self.list_minus = list_minus or []这样,每次创建类的新实例时,列表都会被重新初始化。
https://stackoverflow.com/questions/58684601
复制相似问题