【问题标题】:Why do multiple instances of a Python object behave as if they were the same? [duplicate]为什么一个 Python 对象的多个实例表现得好像它们是一样的? [复制]
【发布时间】:2021-05-02 16:34:55
【问题描述】:

我遇到了这种乍一看违反直觉的 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 内存地址,它们是不同的,而且当我实例化不同的模拟对象时会出现相同的行为

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

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,已解决!会尽快接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2012-06-11
    • 2016-09-04
    • 2020-01-10
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多