关于Update a value when matched in array
的进一步问题data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}]
update={"hostname":"c.example.com","Id":"10"}
for item in data:
if item['hostname'] == 'c.example.com':
item = update
print(data)
为什么输出未更新
[{'hostname': 'a.example.com', 'Id': '1'}, {'hostname': 'b.example.com', 'Id': '2'}, {'hostname': 'c.example.com', 'Id': '1'}, {'hostname': 'd.example.com', 'Id': '1'}]
为什么item['Id'] = 10
有效,但item = update
不起作用?
如何解决?
答案 0 :(得分:2)
作业(=
)不会改变变量。
以下是解决此问题的两个选项:
for i in range(len(data)):
if data[i]['hostname'] == 'c.example.com':
data[i] = update
update
是一种就地方法) for item in data:
if item['hostname'] == 'c.example.com':
item.update(update)
仅当update
变量中的键与项目中的键重叠时,此方法才有效。
答案 1 :(得分:1)
您需要删除数据中的元素并附加update
:
data=[{"hostname":"a.example.com","Id":"1"},{"hostname":"b.example.com","Id":"2"},{"hostname":"c.example.com","Id":"1"},{"hostname":"d.example.com","Id":"1"}]
update={"hostname":"c.example.com","Id":"10"}
for item in data:
if item['hostname'] == 'c.example.com':
data.remove(item) # remove the condition satisfied element
data.append(update) # append the update
print(data)
说明:
此处的=
运算符不会更新您的data
元素。因此,您可以使用remove
和append
删除旧版本并添加新版本。
当您使用item = update
时,表示您item
引用了{"hostname":"c.example.com","Id":"10"}
但未更新实际的data
输出:
[{'hostname': 'a.example.com', 'Id': '1'}, {'hostname': 'b.example.com', 'Id': '2'}, {'hostname': 'd.example.com', 'Id': '1'}, {'hostname': 'c.example.com', 'Id': '10'}]
答案 2 :(得分:1)
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
(*)虽然原始数据未被修改,但它可能被“删除”,即如果它不再被任何变量引用,它的内存可能被释放,因为它不再需要。