有没有一种简单的方法可以在python中模拟指针?

时间:2019-08-15 02:26:39

标签: python pointers variables reference

我希望创建一个在类中具有其他值的列表,并确保该列表是最新的,而不必自己更新。

我试图这样写:

class Test:
    def __init__(self, arg, arg2):
        self.arg = arg
        self.arg2= arg2
        self.list = [self.arg, self.arg2] #list I want up to date

    def update(self, arg, arg2):
        self.arg = arg
        self.arg2 = arg2
        #the simple answer is to add: self.list=[self.arg, self.arg2] or a function doing it. That is not what I am asking.

    def write_list(self):
        print(self.list)

tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()

我希望输出为:

[1,2]
[23,24]

2 个答案:

答案 0 :(得分:1)

int是不可变的。因此,当您在更新方法中执行self.arg=arg时,self.list仍将指向旧值。

我建议创建一个Pointer类来存储您的整数,并使用更新方法来更改值:

class Test:
    def __init__(self, arg, arg2):
        self.arg = Pointer(arg)
        self.arg2= Pointer(arg2)
        self.list = [self.arg, self.arg2]

    def update(self, *args):
        for pointer, val in zip(self.list, args):
            pointer.update(val)

    def write_list(self):
        print (self.list)

class Pointer:
    def __init__(self, num):
        self.num = num

    def update(self, num):
        self.num = num

    def __repr__(self):
        return repr(self.num)

tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()

#[1, 2]
#[23, 24]

答案 1 :(得分:0)

一种替代方法是使用属性,其中lst模仿传统属性,但实际上是在运行时重新创建的。但是,由于每次您访问test_instance.lst时都会重新创建列表,因此效率低下。

class Test:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

    @property
    def lst(self):
        return [self.arg1, self.arg2]

    def update(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

    def write_list(self):
        print(self.lst)

tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()

# Output:
#   [1, 2]
#   [23, 24]

至少在示例代码中,另一个选择就是从.lst内部更新.update()属性:

class Test:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
        self.lst = [arg1, arg2]

    def update(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
        self.lst = [arg1, arg2]

    def write_list(self):
        print(self.lst)

tes = Test(1, 2)
tes.write_list()
tes.update(23,24)
tes.write_list()