首页 > 解决方案 > python中两个名字指向同一个对象

问题描述

考虑以下示例:

class Test:
    def __init__(self, lis: list):
        self.list = lis


lis = [1, 2, 3]
obj1 = Test(lis)
obj2 = Test(lis)

print(obj1 is obj2)
print(obj1.list is obj2.list)

obj1.list.reverse()
print(obj2.list)

输出 :

False
True
[3, 2, 1]

说明

我创建了同一个类的 2 个对象,每个对象的“列表”是[1, 2, 3]. 测试 names是否引用同一个对象,答案是否定的 (False) obj1obj2但是当我测试 if 时obj1.list is obj2.list,我们得到 ' True' 作为答案。因此,当我反转名称列表时obj1,该列表也反转了名称obj2,因为它是两个名称的相同列表。

我需要的是一种反转列表的方法obj1,但不是obj2。所以我需要创建一个新列表。

最后,这将是结果:

obj1.list.reverse()
print(obj2.list)

预期输出:

[1, 2, 3]

标签: pythonpython-3.xlistaliasobject-reference

解决方案


您正在存储对 list in 的相同引用self.list,您可以通过制作副本来避免这种情况:

class Test:
    def __init__(self, lis: list):
        self.list = lis[:]

将其视为指针。因此,当您修改一个时,指向相同值的另一个也会更改。


推荐阅读