是否可以创建动态链接变量?这样original_VAR
中的更改将在copied_VAR
中自动生效?像这样:
original_VAR = 'original_VAL'
copied_VAR = original_VAR
original_VAR = 'modified_VAL'
print(copied_VAR)
#desired output:
>>>> 'modified_VAL'
可以在几种情况下为列表创建类似的行为:
original_DICT_ARR = [{'key': 'original_VAL'}]
# 1 - does not create a dynamic link
copied_DICT_ARR = [value for value in original_DICT_ARR]
# 2 - does create a dynamic link
copied_DICT_ARR = original_DICT_ARR
# 3 - does create a dynamic link, if the copied element is a list or dict, but not if string, boolean, int, float
copied_DICT_ARR = []
copied_DICT_ARR.append(original_DICT_ARR[0])
# MODIFICATION:
original_DICT_ARR[0]['key'] = 'modified_VAL'
# RESULT for 2,3
print(copied_DICT_ARR[0])
>>>> {'key': 'modified_VAL'}
我为什么要这样做?
我正在建立一个列表,该列表充满了dict对象。我需要为某个字典键分配一个值。
稍后,该值可能会更改-我不想再次遍历列表中的所有字典。我想更改原始变量,并自动在所有词典中生效。
答案 0 :(得分:0)
您可以保留引用,以供以后修改的特定dict
使用。由于它引用的是相同的基础dict,因此更改将反映在您的引用中。像这样:
original_DICT_ARR = [{'key': 'original_VAL'}, {'key': 'another_val'}]
target_dict = original_DICT_ARR[0]
# MODIFICATION:
original_DICT_ARR[0]['key'] = 'modified_VAL'
# RESULT for 2,3
print(target_dict)
礼物:
{'key': 'modified_VAL'}
答案 1 :(得分:0)
您可以通过使用可变对象并子类化UserDict并覆盖__getitem__
来实现这一点并使事情保持抽象:
class ChangingVal:
def __init__(self, val):
self.val = val
class ChangingValsDict(UserDict):
def __getitem__(self, key):
ret = self.data[key]
if isinstance(ret, ChangingVal):
ret = ret.val
return ret
my_dict = ChangingValsDict()
changing_val = ChangingVal(3)
my_dict["changing_value"] = changing_val
print(my_dict["changing_value"]) # -- outputs "3"
# change your value
changing_val.val = 6
print(my_dict["changing_value"]) # -- outputs "6"