为什么Python对象的多个实例表现得好像它们是一样的?

我遇到过这种乍一看似乎违反直觉的 python 行为:我有两个对象,SimulationSimulationResults,定义如下:

class Simulation:
    def run_sim_1(self):
        results_logger_1 = SimulationResults()
        for _ in range(10):
            results_logger_1.append(1)
        return results_logger_1

    def run_sim_2(self):
        results_logger_2 = SimulationResults()
        for _ in range(10):
            results_logger_2.append(2)
        return results_logger_2

class SimulationResults:
    results = []

    def append(self,n):
        self.results.append(n)

在这两种 Simulation 方法中,我实例化了一个SimulationResult对象:results_logger_1results_logger_2。我的期望是这两个实例将在每个方法的上下文中定义,然后通过返回它们将它们带出它,因此我期望两个明确定义的实例。

但是,当我运行代码时,结果发现这两个实例似乎是(或指向)同一个对象。

sim_1= Simulation()
results_1 = sim_1.run_sim_1() 
print(len(results_1.results)) # 10, as expected right!
print(results_1.results) # [1,1,1,1,1,1,1,1,1,1] also as expected

results_2 = sim_1.run_sim_2()
print(len(results_2.results)) # this is 20, rather than 10
print(results_2.results) # [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2] - I would have expected [2,2,2,2,2,2,2,2,2,2]

为什么会发生这种情况,我如何获得对象的两个单独实例?

我还检查results_1results_2内存地址,它是不同的,加上我实例化一个不同的模拟对象相同的行为出现

sim_2 = Simulation()
results_3 = sim_2.run_sim_2()
print(len(results_3.results)) # this becomes 30!

回答

SimulationResults.results是所有实例共享的属性。改为将其设为实例属性。

class SimulationResults:
    def __init__(self):
        self.results = []

    def append(self,n):
        self.results.append(n)


以上是为什么Python对象的多个实例表现得好像它们是一样的?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>