<p>此行为在<a href="http://lxml.de/tutorial.html" rel="nofollow noreferrer">lxml tutorial</a>中描述:</p>
<blockquote>
<p>There is another important case where the behaviour of Elements in
lxml (in 2.0 and later) deviates from that of lists and from that of
the original ElementTree (prior to version 1.3 or Python 2.7/3.2):</p>
</blockquote>
<pre><code>>>> for child in root:
... print(child.tag)
child0 child1 child2 child3
>>> root[0] = root[-1] # this moves the element in lxml.etree!
>>> for child in root:
... print(child.tag)
child3 child1 child2
</code></pre>
<blockquote>
<p>In this example, the last element is moved to a different position,
instead of being copied, i.e. it is automatically removed from its
previous position when it is put in a different place. In lists,
objects can appear in multiple positions at the same time, and the
above assignment would just copy the item reference into the first
position, so that both contain the exact same item:</p>
</blockquote>
^{pr2}$
<blockquote>
<p>Note that in the original ElementTree, a single Element object can sit in any number of places in any number of trees,
which allows for the same copy operation as with lists. The obvious
drawback is that modifications to such an Element will apply to all
places where it appears in a tree, which may or may not be intended.
The upside of this difference is that an Element in lxml.etree always
has exactly one parent, which can be queried through the getparent()
method. This is not supported in the original ElementTree.</p>
</blockquote>
<pre><code>>>> root is root[0].getparent() # lxml.etree only!
True
</code></pre>
<blockquote>
<p>If you want to copy an element to a different position in lxml.etree, consider
creating an independent deep copy using the copy module from Python's
standard library:</p>
</blockquote>
<pre><code>>>> from copy import deepcopy
>>> element = etree.Element("neu")
>>> element.append( deepcopy(root[1]) )
>>> print(element[0].tag)
child1
>>> print([ c.tag for c in root ])
['child3', 'child1', 'child2']
</code></pre>