gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:28:07 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to avoid having class data shared among instances?

(7 个回答)


9 个月前关闭。




我遇到过这种乍一看似乎违反直觉的 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)
在这两种模拟方法中,我实例化了一个 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内存地址不同,而且当我实例化不同的 Simulation 对象时会出现相同的行为
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 - 为什么 Python 对象的多个实例表现得好像它们是一样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65942919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com