如何保持包含它的变量和字典一致?

时间:2016-04-29 04:18:58

标签: python-3.x

我有一个变量

self.foo = 1

和一本字典

self.foo_dict = {
    'foo_key' = self.foo
}

我希望能够更改self.foo的值,并将其更改为self.foo_dict。如果这是在C(并且dict是结构),我只使用指针。

有什么建议吗?这在Python中是否可行?

4 个答案:

答案 0 :(得分:4)

  

这在Python中是否可行?

回答1 :不是直截了当的,因为int是不可变的。然而...

回答2 :有实现所需目标的解决方法。

而不是int用于变量foo,您需要为foo设置包装类,因为int是不可变的,你定义的任何包装器类都不是。

foo的包装类:

class Foo:
    def __init__(self, val):
        self.foo = val
    def set(self, val):
        self.foo = val
    def __repr__(self):
        return str(self.foo)

然后,您拥有一致变量字典对的类可能是这样的:

class A:
    def __init__(self):
        self.foo = Foo(1)
        self.foo_dict = {
            'foo_key': self.foo
            }
    def set_foo(self, newval):
        self.foo.set(newval)

试运行:

>>> a = A()
>>> a.foo
1
>>> a.foo_dict['foo_key']
1
>>> a.set_foo(20)
>>> a.foo
20
>>> a.foo_dict['foo_key']
20

答案 1 :(得分:4)

不需要包装类!
只需使self.foo成为访问字典中值的属性:

class Bar:
    def __init__(self, foo_):
        self.foo_dict = {}  
        self.foo = foo_

    @property
    def foo(self):
        return self.foo_dict["foo_key"]

    @foo.setter
    def foo(self, value):
        self.foo_dict["foo_key"] = value

    def show(self):
        print("foo={} ; foo_dict['foo_key']={}".format(
                        self.foo, self.foo_dict["foo_key"]))

b = Bar(1)
b.show()
b.foo = 2
b.show()
b.foo_dict["foo_key"] = 3
b.show()

See this code running on ideone.com

属性像普通实例成员字段一样向外看,但它们实际上是可以执行任何操作的自定义函数。这样,在访问foo(...)属性时会调用两个foo方法。用@property装饰的那个是吸气剂,用@PROPERTYNAME.setter装饰的那个显然是制定者。您还可以通过省略其中一个属性方法来限制对属性的读取或写入访问。

在这里,他们将所有操作重定向到字典。这样,您只有一个简单的可变变量的实例,但有多种方法可以访问它。

上面的示例将导致此输出:

foo=1 ; foo_dict['foo_key']=1
foo=2 ; foo_dict['foo_key']=2
foo=3 ; foo_dict['foo_key']=3

正如我们所看到的,无论我们是改变字典中的值还是通过属性,两个名字总是指向同一个变量。

答案 2 :(得分:1)

>>> class Test(object):
    def __init__(self,foo):
        self.foo = foo
        self.foo_dict = {'foo_key': foo}
    def set_foo(self, foo):
        self.foo = foo
        self.foo_dict['foo_key'] = foo


>>> a = Test(1)
>>> a.foo
1
>>> a.foo_dict
{'foo_key': 1}
>>> a.set_foo(2)
>>> a.foo
2
>>> a.foo_dict
{'foo_key': 2}
>>> 

答案 3 :(得分:-1)

我没有完全理解你的问题但是如果你想改变self.foo的值,你可以直接使用字典来完成。假设你有一些字典:

self.some_dict = {"valueA":1}

考虑到字典按keyvalue对运行,您可以像这样更改valueA的值:

self.some_dict["valueA"] = some_value

因此,密钥的值更改为some_value。作为另一种可能性,您可以使用dict.copy创建字典的副本。有了这个,你有另一个字典与第一个字符的值相同,然后用dict.update更新以在键中添加新的元素或值。像这样:

self.some_dict = {"value1":1}
self.other_dict = some_dict
self.other_dict.update("{"value2": 2}")

使用此功能,您可以将value2更新为other_dict。