【问题标题】:Problem in understanding Python memory allocation for list of objects理解对象列表的 Python 内存分配问题
【发布时间】:2020-03-14 06:24:42
【问题描述】:

我想在不同对象的属性中存储不同的值。但是在下面的程序中,对一个对象的类变量所做的更改也会影响其他对象。似乎所有对象都引用同一个类变量(内存位置)? (不应该)但输出告诉...

class abc:
    list1=[]
    list2=[1,2,3,4,5,6,7,8,9,10]
    def disp_obj(self):
        print("List1=",self.list1,"List2=",self.list2)
    def change(self):
        self.list1.append(self.list2.pop())
xyz=[]
for i in [1,2,3,4]:
    xyz.append(abc())
for i in [0,1,2,3]:
    xyz[i].change()
    xyz[i].disp_obj()

输出:

List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10, 9] List2= [1, 2, 3, 4, 5, 6, 7, 8]
List1= [10, 9, 8] List2= [1, 2, 3, 4, 5, 6, 7]
List1= [10, 9, 8, 7] List2= [1, 2, 3, 4, 5, 6]

但我的预期输出是:

List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]
List1= [10] List2= [1, 2, 3, 4, 5, 6, 7, 8, 9]

【问题讨论】:

    标签: python list class object memory-management


    【解决方案1】:

    所有abc() 实例共享相同的list1list2 属性,因为它们是在类声明中声明的。

    您应该在 __init__ 方法中创建新的。

    class abc:
        def __init__(self):
            self.list1=[]
            self.list2=[1,2,3,4,5,6,7,8,9,10]
        def disp_obj(self):
            print("List1=",self.list1,"List2=",self.list2)
        def change(self):
            self.list1.append(self.list2.pop())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多