创建动态链接变量

时间:2020-04-04 21:16:22

标签: python variables dynamic

是否可以创建动态链接变量?这样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对象。我需要为某个字典键分配一个值。

稍后,该值可能会更改-我不想再次遍历列表中的所有字典。我想更改原始变量,并自动在所有词典中生效。

2 个答案:

答案 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"
相关问题