首页 > 解决方案 > 在 Python 中将变量指针传递给字典

问题描述

我试图从字典上下文中更新一个类,但字典被实例化为类属性的值而不是变量的“指针”。

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

问题是我不知道如何将“指针”传递给类属性“状态”,以便在字典中更新它会在主类结构中更新它。我希望有一些我不明白的愚蠢或我以完全错误的方式这样做,但任何帮助将不胜感激。

标签: pythondictionarypointers

解决方案


你不能在 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)

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

基本上,您使用 dict 的键作为指针。此外,您甚至不需要pointers,因为这只不过是与values.

所以实际上是 dict 键充当您想要的指针。

Python 只使用引用。任何名称都是绑定到某个对象的引用。跟踪对不可变对象的引用,例如strint不会按预期工作,因为如果您在前面的代码中为它们分配新值,则会创建新对象并将其绑定到相同的引用(原始对象不能更改)。


推荐阅读