【发布时间】:2021-05-02 16:34:55
【问题描述】:
我遇到了这种乍一看违反直觉的 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)
在两种模拟方法中,我实例化了一个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!
【问题讨论】:
标签: python python-3.x