所以我试图将一些列表存储到一个属于" person"的列表中。我尝试用一些类来做这个:
class data():
# Contains list of x, y, z, time lists
x = []
y = []
z = []
time = []
class data_main():
# Contains data for each Pi
data_plot = data()
data_overflow = data()
piList = ["Lui", "Wing"]
rpi_data = {}
for pi in piList:
rpi_data[pi] = data_main()
rpi_data["Lui"].data_plot.x = 10
rpi_data["Wing"].data_plot.x = 99
print(rpi_data["Lui"].data_plot.x)
print(rpi_data["Wing"].data_plot.x)
问题是,我实际上并不知道会有多少人。因此我想创建一个类的字典" data_main"属于不同的人。
当我尝试这样做时,控制台结果是:
99
99
当我更喜欢它时:分别为10和99。我在for循环中担心:
for pi in piList:
rpi_data[pi] = data_main()
我真的只是在字典条目中指定data_main()的相同实例,而实际上我更喜欢独特的实例,这样他们每个人都可以拥有自己的值。
我如何实现这一目标?
编辑:我做了更多挖掘,结果发现data_plot对于data_main()的两个实例都指向同一个地址。我如何避免这种情况(即,每次初始化一个新的data_main()类时,我都会创建新的data_plot()和data_overflow()类?)
答案 0 :(得分:4)
您的data_plot
和data_overflow
是类属性而非实例属性,因此它们在定义类时初始化,而不是在创建实例时初始化,并且它们在类的所有实例之间共享。您应该在__init__()
方法中将它们创建为实例属性。示例 -
class data_main:
def __init__(self):
# Contains data for each Pi
self.data_plot = data()
self.data_overflow = data()
同样在你的data
类中,其中的属性也是类属性,你也应该将它们作为实例属性。示例 -
class data:
def __init__(self):
# Contains list of x, y, z, time lists
self.x = []
self.y = []
self.z = []
self.time = []
最后,在data
课程中,您首先将x
定义为列表,然后将x
rpi_data["Lui"].data_plot.x
更改为一个数字,当您这样做时 -
rpi_data["Lui"].data_plot.x = 10 #or the 99 one.
如果您打算将号码附加到x
列表,则应使用 -
rpi_data["Lui"].data_plot.x.append(10)