python - python类:通过列表访问时类属性不会更新
问题描述
我在 python 类中遇到了一些奇怪的行为,我希望有人能够解释原因并修复。我正在使用 python 3.8.5。问题是当我有一个类属性列表并尝试更新它们时,它们似乎没有得到更新。这是一个简单的例子。
class testclass:
def __init__(self) -> None:
self.a = 2
self.b = 3
self.c = 4
def update(self):
for s in [self.a, self.b, self.c]:
s = 10
def response(self):
self.update()
print([self.a, self.b, self.c])
if __name__ == '__main__':
myclass = testclass()
myclass.response()
我得到的输出是 [2, 3, 4],在应用该update()
方法后应该是 [10,10,10],对吧?有没有更好的方法来做这样的事情?
解决方案
当您遍历 list[self.a, self.b, self.c]
时,每个s
实际上都是该元素的副本。
这可以更简单地归结为摆脱class
和self
东西:
>>> f = [1, 2, 3]
>>> for s in f:
... # s is implicitly assigned s=1, s=2, s=3
... s = 10
...
>>> f
[1, 2, 3]
有没有更好的方法来做这样的事情?
取决于你在这里真正想要做什么,因为这个例子似乎有点做作。一般来说,尽量避免在迭代列表时对其进行修改。
假设您的目标是将每个设置self.XXX
为任意 int。这是一种 Pythonic 方式,您可以这样做:
self.a = self.b = self.c = 10
确保仅对不可变数据使用此技巧,例如 int 10。例如,如果您要对列表进行链式分配,未来的分配也会改变您正在处理的属性之外的其他属性。
推荐阅读
- c# - 如何在 .NET Core 3 的 Controller 的构造函数中访问 HttpContext?
- angular - 获取Angular中更改事件的选定选项值
- ml.net - ML.Net:具有多个输出的 ONNX 模型 - 推理时间差
- build - VS2019中build和Clean&Rebuild有什么区别
- python - 在日志中写入python脚本的内容
- mysql - 选择日期最长的消息
- r - 并行调用 Rcpp::Function
- sql - 在 oracle 中将旧式联接转换为 ansi 联接
- javascript - 我在引导表上制作手风琴,数据来自 ng-repeat 循环,没有 ui.bootstrap 也没有 jquery
- xamarin - 安装 Plugin.FirebasePushNotification 后无法将构建操作设置为 GoogleServiceJson