[英]Ussing two classes instances
当我意识到它们使用相同的值时,我正在处理 python class 的两个实例。 我想我对类的用途有误解。
一个更简单的例子:
class C():
def __init__(self,err = []):
self.err = err
def add(self):
self.err.append(0)
a = C()
print(a.err) # []
a.add()
print(a.err) # [0]
b = C()
print(b.err) # [0]
b.add()
print(a.err) # [0,0]
print(b.err) # [0,0]
我不明白为什么 b.err 以 [0] 而不是 [] 开头。 以及为什么将元素添加到 b 时它也会影响 a。
原因就在这里:
def __init__(self,err = []):
默认err
值保存在 class C
。 但是err
本身是可变的,所以每次你给它 append 任何东西,下次它都会有存储值,这个默认的err
值被保存为a.err
和b.err
:
a = C()
print(a.err) # a.err is err ([])
a.add()
print(a.err) # err is [0]
b = C()
print(b.err) # reused err that is [0]
b.add() # err is [0, 0]
print(a.err) # [0,0]
print(b.err) # [0,0]
所以基本上err
inside a
和b
是一样的
文章: https://florimond.dev/en/posts/2018/08/python-mutable-defaults-are-the-source-of-all-evil/
我建议你先查看 Python 核心语言特性。 查看 Python 3 的官方常见问题解答,尤其是https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects是您要查找的内容。
根据建议,您必须像这样更改代码
from typing import List
class C():
def __init__(self,err: List = None):
self.err = [] if err is None else err
def add(self):
self.err.append(0)
a = C()
print(a.err) # []
a.add()
print(a.err) # [0]
b = C()
print(b.err) # []
b.add()
print(a.err) # [0]
print(b.err) # [0]
我还将链接到文档中可变性的概念,因为这似乎是 OP 的问题: https://docs.python.org/3/glossary.html#term-mutable
在这里我们要确定一个列表是 python 中的可变数据结构。这意味着我们可以根据需要更改它。 Class 是 object 的蓝图,因此在创建 object 之后它应该可以单独工作<-这是你的问题。 是的,通常它是正确的,但在这里,当我们不为构造函数后的参数提供默认值时。 在我们创建了一个object之后就变了。我们要正确判断概念。
下面给出的代码审查,
a = C()
print(a.err) # [] #empty err list
a.add()
print(a.err) # append 0 into err list
b = C()
print(b.err) # after create object that create a showing you in here
b.add() #aappend another 0 to err list
print(a.err) # [0,0] #err list
print(b.err) # [0,0] #err list
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.