python - 为什么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”?
解决方案
每个实例共享同一个由类属性引用的列表register
。self.register = []
如果您希望每个实例都有自己的寄存器,请通过定义in使其成为实例属性__init__
。
class flower:
tpe="standard"
def __init__(self):
self.register = []
当您编写时amapola.tpe = "spring"
,您正在创建一个新的实例属性,它会影响类属性tpe
。您也可以摆脱 class 属性并定义tpe
in __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.register
register
amapola.register.append
推荐阅读
- fabricjs - 如何创建一个可移动的背景图像,可移动的前景对象用 Fabric JS 固定到该图像上?
- autodesk-forge - 在 Autodesk Forge 查看器中选择多个对象
- javascript - Firebase 实时数据库 - 额外数据节点的最佳实践(查找和初始加载)
- excel - 如何使用 VBA 代码 Excel 进行代码循环,直到另一个工作簿中的最后一张工作表?
- node.js - 检查 NODE_ENV 是否会不必要地减慢我们在生产中的 Express 应用程序?
- java - Java:如何读取带有日期作为名称一部分的文件
- laravel - Laravel 有查询
- vhdl - 使用 FIFO 的 VHDL 中的 FPGA 到 HPS 通信
- java - 在 Android studio 中,在我的应用程序中,图像没有被位图替换
- r - 如何使用 cmd 预处理整数值上的 .csv 文件并从 data.table 中读取