【问题标题】:Why does append method modify a variable within a class in python?为什么append方法会修改python类中的变量?
【发布时间】:2021-09-15 13:51:58
【问题描述】:

我正在尝试理解 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”会列在“cactus”注册表中。我认为当创建变量“仙人掌”时,列表将设置为零。或者另一方面,如果寄存器在被变量“amapola”修改时被保存,为什么在“cactus”中如果之前也被修改过,它会返回“standard”而不是“spring”?

【问题讨论】:

    标签: python class append


    【解决方案1】:

    每个实例共享 class 属性 register 引用的 same 列表。如果您希望每个实例都有自己的寄存器,请通过在 __init__ 中定义 self.register = [] 使其成为实例属性。

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

    当您编写amapola.tpe = "spring" 时,您正在创建一个新的实例属性,它隐藏 类属性tpe。你也可以去掉class属性,在__init__中也定义tpe

    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.register 包含您定义的所有实例的名称,那么将register 作为类属性保留. amapola.register.append 不是对名称的赋值;这是一种改变现有值的方法。

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2015-07-23
      • 2020-07-20
      相关资源
      最近更新 更多