为什么Python对象的多个实例表现得好像它们是一样的?
我遇到过这种乍一看似乎违反直觉的 python 行为:我有两个对象,Simulation
和SimulationResults
,定义如下:
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_1
和results_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_1
和results_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)