2014-03-31 191 views
0

我正在用Python写一个程序。我有一个使用列表的2D矩阵实现,我已经声明了所有函数的范围。这个想法是存储在从随后的函数调用计算出的矩阵值中。我的代码是这样的:矩阵值被覆盖 - Python

database=[[0 for i in range(2)] for j in range(2)] #2-D matrix 

def func(data,x,y): 
    #manipulate the list data and then store it in database[x][y] 
    data[1]+=1 
    database[x][y]=data 

    print("database[0][0]={}, database[1][1]={}".format(database[0][0], database[1][1])) 
    del data[:] 

def main(): 
    data=['one',1] 
    func(data,0,0) 

    data=['two',2] 
    func(data,1,1) 

if __name__=="__main__":main() 

最后,我得到数据库[0] [0]为不同的东西。我想知道为什么index [0] [0]没有['one',2]!任何帮助,将不胜感激。谢谢!

+0

我试着运行你的代码,它工作正常(没有覆盖)。 – Bitwise

+0

我没有发布实际的代码,因为它涉及存储进入网络接口的数据包,然后将几个字段存储到列表中。它的一种复杂。我应该在这里发布代码吗? – shank22

+0

简化代码更好,但前提是您可以重新创建问题。否则没人能帮忙。 – Bitwise

回答

0

func当你做del data[:]你删除本地参数data指向的对象。所以即使你已经在数据库中存储了对它的引用,它已经消失了。

您可以:

  • 删除delete语句,局部变量将反正丢弃,也没有必要为此
  • 使用database[x][y]=list(data),而不是使数据的副本作为一个新的对象
+0

实际上,在我的实现中,数据是一个全局列表,并且必须在它被分配给矩阵中的特定索引后清除。因此我必须使用del运算符。但通过使用列表(数据)解决了我的问题!谢谢:) – shank22

+0

啊,很高兴它帮助了。 – rateldajer