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想要的效果