繁体   English   中英

使用两个类实例

[英]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.errb.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 ab是一样的

文章: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM