x = something
Если у вас есть что-то, назначенное для x, например, x = object1
, то, если вы напишите x = object2
, это не влияет на object1
* (или любые другие данные, в этом отношении) в любом случае.Это просто означает, что переменная x
теперь относится к другому объекту (object2
, а не object1
).
x.y = something
С другой стороны, x.y = something
влияет на данные(в общем случае).Он изменяет данные в x
.Он по-прежнему не изменяет данные, которые ранее были в x.y
*, - на старые данные больше не ссылаются x.y
.
x['y'] = something
Это семантика очень похожа на x.y = something
.
Исходный пример
for item in data:
if item['hostname'] == 'c.example.com':
item = update
После item = update
переменная item
больше не ссылается на элемент из data
, она ссылается на другую переменную: update
.Если вы print(item)
, вы увидите это.
Строка, которая выполняется после этого, - for item in data
, которая снова изменяет то, на что ссылается item
, таким образом, эффективно отменяя предыдущую строку.
На самом деле вы хотите изменить data
, поэтому вы должны сделать это, например,
for i in range(len(data)):
...
data[i] = update
(*) Хотя исходные данные этим не изменяются, они могут быть «удалены», т.е.его память может быть освобождена, если на нее больше не ссылается какая-либо переменная, потому что она больше не нужна.