Python自定义类属性未按预期更新问题咨询
问题解析:为什么
a.updated返回空(实际是None)? 嘿,这个问题的核心是你对列表append()方法的返回值理解有偏差,我来给你一步步捋清楚:
根本原因:append()的返回值是None
列表的append()方法是原地修改原列表的——它会直接把元素添加到你现有的列表里,但这个方法本身的返回值是None,而不是修改后的列表。
所以你这段代码里:
self.updated = self.values.append(value)
其实是把append()返回的None赋值给了self.updated,而不是你以为的更新后的列表。至于a.values能显示更新结果,是因为append()已经直接修改了self.values指向的那个列表对象本身。
解决方案
如果你想让self.updated指向更新后的列表,有两种简单的处理方式:
方式1:先执行append,再赋值
先调用append()修改原列表,再把修改后的列表赋值给updated:
def add_val(self, value): self.values.append(value) self.updated = self.values # 直接引用已经修改后的列表
这样self.updated和self.values会指向同一个列表对象,后续修改其中一个,另一个也会跟着变化(因为是同一个对象)。
方式2:生成新列表(可选)
如果你不想让updated和values指向同一个列表,而是要生成一个全新的列表,可以用列表拼接:
def add_val(self, value): self.updated = self.values + [value] # 生成新列表,原values不会被修改
这种方式下,self.values保持原样,self.updated是包含新元素的独立列表。
额外提醒:你的类还有一个潜在陷阱
顺便提一句,你定义类时用了l_values=[]作为默认参数,这是Python里一个很容易踩的坑:
def __init__ (self, name, l_values=[]):
因为Python的默认参数是在函数定义时创建的,而不是每次调用时创建。如果多次创建otest实例却不传入l_values参数,这些实例会共享同一个默认列表,导致意想不到的结果:
b = otest('bob') b.add_val(5) c = otest('charlie') print(c.values) # 会输出[5],而不是预期的空列表!
解决这个陷阱的方法是把默认参数设为None,然后在__init__里初始化:
class otest: def __init__(self, name, l_values=None): self.name = name self.values = l_values if l_values is not None else [] def add_val(self, value): self.values.append(value) self.updated = self.values
内容的提问来源于stack exchange,提问作者xovut
相关产品推荐
相关产品推荐

