为什么在我追加xml对象后我想改变它的子节点所有的值都被改变了?
我想复制xml元素并更改它的'dd'值。示例输入表:
<aaa>
<bb>
<cc>dd</cc>
</bb>
</aaa>
我希望以下代码可以解决问题:
import xml.etree.ElementTree as ET
import copy
xml = ET.parse('xml.xml')
root = xml.getroot()
entity = copy.deepcopy(root[0])
for i in range(1, 5):
print(i)
root.append(entity)
root[i][0].text = 'eee'+str(i)
xml.write('output_xml.xml')
我希望看到eee1到eee4的价值观,但出乎意料的是我收到了:
<aaa>
<bb>
<cc>dd</cc>
</bb>
<bb>
<cc>eee4</cc>
</bb>
<bb>
<cc>eee4</cc>
</bb>
<bb>
<cc>eee4</cc>
</bb>
<bb>
<cc>eee4</cc>
</bb>
</aaa>
运行以下代码:
import xml.etree.ElementTree as ET
import copy
xml = ET.parse('output_xml.xml')
root = xml.getroot()
entity = copy.deepcopy(root[0])
for i in range(1, 5):
print(i)
root[i][0].text = 'eee'+str(i)
xml.write('output_xml.xml')
更正输出:
<aaa>
<bb>
<cc>dd</cc>
</bb>
<bb>
<cc>eee1</cc>
</bb>
<bb>
<cc>eee2</cc>
</bb>
<bb>
<cc>eee3</cc>
</bb>
<bb>
<cc>eee4</cc>
</bb>
</aaa>
答案 0 :(得分:1)
确定。所以我的老朋友已经解决了这个问题。探测是在python中一切都是参考,在这种情况下,我们最终会引用彼此引用的所有实体副本。要解决此问题,我们需要更改:
root.append(entity)
为:
root.append(copy.deepcopy(entity))