Как перебрать значения в JSON и присвоить их другому словарю

Я разрабатываю веб-приложение на Python/Django. Я пытаюсь разобрать JSON в словарь python, прочитать значения в словаре и присвоить значения другому словарю, если выполняются определенные условия.

JSON структурирован следующим образом:

{content: {cars: [0, 1, 2]}, other_stuff: []}

Каждый автомобиль имеет несколько атрибутов:

0: {"make", "model", "power"...}

Каждый атрибут имеет три переменные:

make: {"value": "Toyota", "unit": "", "user_edited": "false"} 

Я пытаюсь присвоить значения в JSON другим словарям; car_0, car_1 и car_2. В этом случае ответ JSON идентичен для каждого автомобиля, но "марка" первого автомобиля изменена на "Nissan", и я пытаюсь изменить марку автомобиля_0 также на "Nissan". Я разбираю JSON следующим образом:

    local_cars = [car_0, car_1, car_2] # Dictionaries which are already initialized.

    print(local_cars[0]['make']['value']) # Prints: Toyota (yes)
    print(local_cars[1]['make']['value']) # Prints: Toyota (yes)
    print(local_cars[2]['make']['value']) # Prints: Toyota (yes)
    
    counter = 0
    
    if request.method == 'POST':
        payload = json.loads(request.body)
        if bool(payload):
            print(len(local_cars)) # Prints: 3
            print(counter, payload['cars'][0]['make']['value']) # Prints: Nissan (yes)
            print(counter, payload['cars'][1]['make']['value']) # Prints: Toyota (yes)
            print(counter, payload['cars'][2]['make']['value']) # Prints: Toyota (yes)
            print(counter, local_cars[0]['make']['value']) # Prints: Toyota (yes)
            print(counter, local_cars[1]['make']['value']) # Prints: Toyota (yes)
            print(counter, local_cars[2]['make']['value']) # Prints: Toyota (yes)
            for target_car in payload['cars']: # Loop through all three cars in payload
                print(counter, local_cars[counter]['make']['value']) # Prints: 0, Toyota (yes), 1, Nissan (no!), 2, Nissan (no!)
                for attr in target_car.items(): # Loop through all key:dict pairs of a single car
                    attribute_key = attr[0] # Key (eg. 'make')
                    vars_dict = attr[1] # Dictionary of variables ('value': 'xx', 'unit': 'yy', 'user_edited': 'zz')
                    if vars_dict['user_edited'] == 'true':
                        local_cars[counter][attribute_key]['user_edited'] = 'true'
                        local_cars[counter][attribute_key]['value'] = vars_dict['value']              
                counter = counter + 1

Я не понимаю, почему другие автомобили, local_cars[1] и local_cars[2], каким-либо образом затронуты в этом цикле. Как видно, по какой-то причине их 'make' меняется на 'Nissan', хотя в теле запроса было 'Toyota'. Похоже, что это происходит в первом цикле 'for target_car in payload['cars'].

Отказ от цикла/счетчика и фокусировка на одном автомобиле не имеет никакого значения:

for target_car in payload['cars']: --> target_car = payload['cars'][0]: 
...
local_cars[0][attribute_key]['user_edited'] = 'true'
local_cars[0][attribute_key]['value'] = vars_dict['value'] 

Что я делаю неправильно? Как могут быть затронуты car_1 и car_2, даже если я изменю единственную часть кода, где редактируются любые значения в этих словарях, чтобы они влияли только на local_cars[0]?

Я думаю, что вы, вероятно, не умеете снимать копии car_0 и т.д. Не забывайте, что присвоение в python - это чисто привязка к имени.

x = car_0
y = car_0
print( x['make']['value'] ) # 'Toyota'
print( y['make']['value'] ) # 'Toyota'
print( x is y ) # True. Both names refer to the same object
x['make']['value'] = 'foo'
print( y['make']['value'] ) # 'foo'

Должно было быть y = car_0.copy() или даже y=car_0.deepcopy().

Я не совсем понимаю ваш код, но если вы все еще не уверены, то проведите is тестирование, чтобы выяснить, какие сущности привязаны к одному объекту (и не должны быть).

Вернуться на верх