Python:修改作为值存储在字典中的变量

Python:修改作为值存储在字典中的变量,python,dictionary,Python,Dictionary,我有以下情况: >>> a = 1 >>> d = {"a": a} >>> d {'a': 1} >>> d["a"] = 2 >>> d {'a': 2} >>> a 1 当然,这是理想的行为。但是,当我将2分配给字典d的键“a”时,我想知道我是否可以访问变量a而不是它的值来直接修改变量a的值,通过字典访问它。也就是说,我预期的最后输出是 &g

我有以下情况:

>>> a = 1
>>> d = {"a": a}
>>> d
{'a': 1}
>>> d["a"] = 2
>>> d
{'a': 2}
>>> a
1
当然,这是理想的行为。但是,当我将2分配给字典
d
的键
“a”
时,我想知道我是否可以访问变量
a
而不是它的值来直接修改变量
a
的值,通过字典访问它。也就是说,我预期的最后输出是

>>> a
2
>>> 2
有什么方法可以做到这一点吗?

当你这样做的时候

>>> a
,调用在第一行设置的变量
a
的值。您没有更改该变量的值,因此输出了
1
。如果是的话

>>> d["a"]
,您的输出将是

>>> a
2
>>> 2
。如果希望此值也是变量
a
的值,请将
a
的值设置为
d[“a”]
。 范例-

当你这样做的时候

>>> a
,调用在第一行设置的变量
a
的值。您没有更改该变量的值,因此输出了
1
。如果是的话

>>> d["a"]
,您的输出将是

>>> a
2
>>> 2
。如果希望此值也是变量
a
的值,请将
a
的值设置为
d[“a”]
。 范例-


我想你知道可变和不可变对象的概念。不可变对象(str、int、float等)按值传递。这就是为什么你想要的行为不能起作用。当您这样做时:

a = 1 
d["a"] = a
您只需将
a
变量的值传递给dict键“a”
d['a']
对变量
a
一无所知。它们只是指向内存中相同的原语值

我不知道您的情况以及为什么需要这种行为,但您可以尝试使用可变对象。 例如:

class A:
    def __init__(self, a: int):
        self._value = a

    @property
    def value(self) -> int:
        return self._value

    @value.setter
    def value(self, a: int):
        # you can put some additional logic for setting new value
        self._value = a

    def __int__(self) -> int:
        return self._value
然后你可以这样使用它:

>>> a = A(1)
>>> d = {"a": a}
>>> d['a'].value
1
>>> d["a"].value = 2
>>> d['a'].value
2
>>> a.value
2
>>> int(a)
2

但这似乎仍然是一种开销,您应该重新考虑是否真的需要这种行为。

我想您知道可变和不可变对象的概念。不可变对象(str、int、float等)按值传递。这就是为什么你想要的行为不能起作用。当您这样做时:

a = 1 
d["a"] = a
您只需将
a
变量的值传递给dict键“a”
d['a']
对变量
a
一无所知。它们只是指向内存中相同的原语值

我不知道您的情况以及为什么需要这种行为,但您可以尝试使用可变对象。 例如:

class A:
    def __init__(self, a: int):
        self._value = a

    @property
    def value(self) -> int:
        return self._value

    @value.setter
    def value(self, a: int):
        # you can put some additional logic for setting new value
        self._value = a

    def __int__(self) -> int:
        return self._value
然后你可以这样使用它:

>>> a = A(1)
>>> d = {"a": a}
>>> d['a'].value
1
>>> d["a"].value = 2
>>> d['a'].value
2
>>> a.value
2
>>> int(a)
2

但这似乎仍然是一项开销,你应该重新考虑你是否真的需要这种行为。

这个答案可以帮助你理解你的问题@JorgeVerdeguerGómez,这非常有启发性,谢谢这个答案可以帮助你理解你的问题@JorgeVerdeguerGómez,这非常有启发性,感谢当它提供OP想要的输出时,它并没有达到OP想要的效果。当它提供OP想要的输出时,它并没有达到OP想要的效果