在Python中将变量指针传递给字典

时间:2019-07-16 08:59:47

标签: python dictionary pointers

我正在尝试从字典上下文中更新类,但是字典会使用类属性的值而不是变量的“指针”实例化。

class SomeClass():
    status = 0

new_entry = SomeClass()

print (new_entry.status) #prints 0 - expected

data_attribute ={
    "status":[1407,new_entry.status,0]
}
data_attribute["status"][1] = 123

print (data_attribute["status"]) # prints 123 - expected

print (new_entry.status) # prints 0 - not desired

问题是我不知道如何将“指针”传递给类属性“状态”,以便在字典中对其进行更新会在主类结构中对其进行更新。我希望有些愚蠢的事情我不了解,或者我完全以错误的方式进行,但是会有所帮助。

1 个答案:

答案 0 :(得分:0)

在Python中您无法做到这一点。 通常的选择是存储对对象的引用,并遍历该引用以获取属性。这完全不适合您编写代码的方式,只是因为Python中没有指针。

class SomeClass():
    status = 0

new_entry = SomeClass()

print (new_entry.status) #prints 0 - expected

data_attribute ={
    "status":[1407, new_entry, 0]
}
data_attribute["status"][1].status = 123

print (data_attribute["status"][1].status) # prints 123 - expected

print (new_entry.status) # prints 123 - OK

下面的示例可以更好地满足您的意图,但仅是为了使事情变得显而易见:

class A:
    def __init__(self):
        self.status = 0

a = A()

values = dict(a=a)
pointers = values

print(pointers['a'] is a)
print(pointers['a'].status)
print(a.status)

a.status = 1
print(pointers['a'].status)

pointers['a'].status = 2
print(a.status)

请注意我如何将状态存储在实例中而不是类中。实例属性在分配时会隐藏类属性。

基本上,您将字典的键用作指针。另外,您甚至不需要pointers,因为与values相同的对象字典仅是另一个名称。

因此,实际上是dict键充当了您想要的指针。

Python仅使用引用。任何名称都是绑定到某个对象的引用。跟踪对诸如strint之类的不可变对象的引用将无法按预期进行,因为如果在前面的代码中为它们分配新值,则将创建新对象并将其绑定到相同的引用(原始对象无法更改)。