簡體   English   中英

Python2.7:確保3D對象列表是唯一的

[英]Python2.7: Ensure 3D list of objects are unique

我在Python中使用3D對象列表來組織我擁有的數據集。 我注意到我的對象元素不是很獨特,即數組的一個對象內的變量正在其他對象中更新。 一個說明我的問題的最小工作示例如下所示。

class myClass:
        def __init__(self,ListA=[],ListB=[],ListCount=0):
                self.ListA = ListA
                self.ListB = ListB
                self.ListCount = ListCount

        def add_data(self,ElementA,ElementB):
                self.ListA.append(ElementA)
                self.ListB.append(ElementB)
                self.ListCount = self.ListCount + 1

        def check_data(self):
                if(len(self.ListA) != self.ListCount):
                        print("Error: Unaccounted for Data in Object!")
                        print("Object has %d elements. Thinks it has %d"%(len(self.ListA),self.ListCount))

使用這個類定義的python代碼就是這樣的。

import random

ObjectArray = [[[myClass() for k in range(4)] for j in range(3)] for i in range(2)]
#Print addresses of object array
print("Addresses of the individual object elements in the 3D list ")
for i in range(0,2):
        for j in range(0,3):
                for k in range(0,4):
                        print(ObjectArray[i][j][k])

#Loop over object array and fill each object with some data
for i in range(0,2):
        for j in range(0,3):
                for k in range(0,4):

                        NumData = int(10*random.random())

                        for m in range(0,NumData):

                                #Generate some junk data to insert into the list of this object
                                ListAData = int(10*random.random())
                                ListBData = int(10*random.random())

                                ObjectArray[i][j][k].check_data()
                                ObjectArray[i][j][k].add_data(ListAData,ListBData)
                                ObjectArray[i][j][k].check_data()

我錯過了什么? 是否可以在Python 2.7中使用3D對象列表? 當我打印出來時,列表中的每個對象看起來都有一個唯一的內存地址。 任何見解將不勝感激。

此代碼的輸出示例如下:

Addresses of the individual object elements in the 3D list 
<__main__.myClass instance at 0x7fc59ad4ef80> <__main__.myClass
 instance at 0x7fc59ad635a8> <__main__.myClass instance at
 0x7fc59ad63248> <__main__.myClass instance at 0x7fc59ad63440>
 <__main__.myClass instance at 0x7fc59ad6d320> <__main__.myClass
 instance at 0x7fc59ad6d368> <__main__.myClass instance at
 0x7fc59ad6d3b0> <__main__.myClass instance at 0x7fc59ad6d3f8>
 <__main__.myClass instance at 0x7fc59ad6d488> <__main__.myClass
 instance at 0x7fc59ad6d4d0> <__main__.myClass instance at
 0x7fc59ad6d518> <__main__.myClass instance at 0x7fc59ad6d560>
 <__main__.myClass instance at 0x7fc59ad6d638> <__main__.myClass
 instance at 0x7fc59ad6d680> <__main__.myClass instance at
 0x7fc59ad6d6c8> <__main__.myClass instance at 0x7fc59ad6d710>
 <__main__.myClass instance at 0x7fc59ad6d7a0> <__main__.myClass
 instance at 0x7fc59ad6d7e8> <__main__.myClass instance at
 0x7fc59ad6d830> <__main__.myClass instance at 0x7fc59ad6d878>
 <__main__.myClass instance at 0x7fc59ad6d908> <__main__.myClass
 instance at 0x7fc59ad6d950> <__main__.myClass instance at
 0x7fc59ad6d998> <__main__.myClass instance at 0x7fc59ad6d9e0> 
Error: Unaccounted for Data in Object! Object has 4 elements. Thinks it has 0
Error: Unaccounted for Data in Object! Object has 5 elements. Thinks it has 1 
Error: Unaccounted for Data in Object! Object has 5 elements. Thinks it has 1 
Error: Unaccounted for Data in Object! Object has 6 elements. Thinks it has 2 
Error: Unaccounted for Data in Object! Object has 6 elements. Thinks it has 2 
Error: Unaccounted for Data in Object! Object has 7 elements. Thinks it has 3 
Error: Unaccounted for Data in Object! Object has 7 elements. Thinks it has 3 

改為

class myClass:
    def __init__(self,ListA=None,ListB=None,ListCount=0):
            self.ListA = [] if ListA is None else ListA
            self.ListB = [] if ListB is None else ListB
            self.ListCount = ListCount

這將避免可變的默認參數

考慮以下

class MyClass:
    def __init__(self,a=[],b=None):
        self.a = a
        print "ID of a:",id(a)
        if b is not None:
           self.a.append(b)

print MyClass(b=5).a
print MyClass(b=6).a
print MyClass(b=7).a

請注意,每個MyClass都有一個唯一的內存位置,但是所有3個指向同一個數組(a的默認參數)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM