создать динамические c связанные переменные - PullRequest
0 голосов
/ 05 апреля 2020

Можно ли создать динамическую c связанную переменную? Так что изменения в 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. Мне нужно присвоить значение определенной клавише dict.

Позже это значение может измениться - я не хочу снова l oop через все словари в списке. Я хочу изменить исходную переменную, и эффект будет иметь место во всех словарях автоматически.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Вы можете достичь этого и сохранить абстрактность, используя изменяемый объект и подклассы 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"
0 голосов
/ 05 апреля 2020

Вы можете сохранить ссылку на c 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'}
...