首页 > 解决方案 > 为什么append方法会修改python类中的变量?

问题描述

我试图了解python中的类类型。就在我以为我理解它的时候,我发现了这个。我不明白为什么当我使用 append 方法时,它会被保存为其他变量。例子:

class flower:
    tpe="standard"
    register=[]
     
    def __init__(self):
        pass
    
amapola=flower()
amapola.register.append("Amapola")
amapola.tpe="spring"
print(f"Type: {amapola.tpe}, register= {amapola.register}")

cactus=flower()
cactus.register.append("Cactus")
print(f"Type: {cactus.tpe}, register= {cactus.register}")

输出:

Type: spring, register= ['Amapola']
Type: standard, register= ['Amapola', 'Cactus']

我不明白为什么“amapola”被列在“仙人掌”寄存器中。我认为当创建变量“仙人掌”时,列表将设置为零。或者另一方面,如果寄存器在被变量“amapola”修改时被保存,为什么在“cactus”中如果之前也被修改过,它会返回“standard”而不是“spring”?

标签: pythonclassappend

解决方案


每个实例共享同一个由属性引用的列表registerself.register = []如果您希望每个实例都有自己的寄存器,请通过定义in使其成为实例属性__init__

class flower:
    tpe="standard"
     
    def __init__(self):
        self.register = []

当您编写时amapola.tpe = "spring",您正在创建一个新的实例属性,它会影响类属性tpe。您也可以摆脱 class 属性并定义tpein __init__

class flower:
    tpe="standard"
     
    def __init__(self, tpe="standard"):
        self.register = []
        self.tpe = tpe

amapola=flower("spring")
amapola.register.append("Amapola")
print(f"Type: {amapola.tpe}, register= {amapola.register}")

cactus=flower()
cactus.register.append("Cactus")
print(f"Type: {cactus.tpe}, register= {cactus.register}")

另一方面,如果真的register应该共享,那么它包含您定义的所有实例的名称,则保留为类属性。 不是对名称的分配;这是一种改变现有值的方法。flower.registerregisteramapola.register.append


推荐阅读