<p><code>[:]</code><a href="http://en.wikipedia.org/wiki/Deep_copy#Shallow_copy" rel="noreferrer">Shallow copies</a>列表,生成包含对原始列表成员的引用的列表结构的副本。这意味着对副本的操作不会影响原始文件的结构。但是,如果对列表成员执行某些操作,则两个列表仍然引用它们,因此,如果通过原始成员访问成员,则会显示更新。</p>
<p>一个<a href="http://en.wikipedia.org/wiki/Deep_copy#Deep_copy" rel="noreferrer">Deep Copy</a>也会复制所有列表成员。</p>
<p>下面的代码片段显示了一个正在运行的浅层副本。</p>
<pre><code># ================================================================
# === ShallowCopy.py =============================================
# ================================================================
#
class Foo:
def __init__(self, data):
self._data = data
aa = Foo ('aaa')
bb = Foo ('bbb')
# The initial list has two elements containing 'aaa' and 'bbb'
OldList = [aa,bb]
print OldList[0]._data
# The shallow copy makes a new list pointing to the old elements
NewList = OldList[:]
print NewList[0]._data
# Updating one of the elements through the new list sees the
# change reflected when you access that element through the
# old list.
NewList[0]._data = 'xxx'
print OldList[0]._data
# Updating the new list to point to something new is not reflected
# in the old list.
NewList[0] = Foo ('ccc')
print NewList[0]._data
print OldList[0]._data
</code></pre>
<p>在python shell中运行它会得到以下脚本。我们可以看到
正在用旧对象的副本制作的列表。其中一个对象可以
它的状态通过旧列表的引用更新,更新可以是
在通过旧列表访问对象时看到。最后,改变
新列表中的引用不能反映在旧列表中,因为
新列表现在引用另一个对象。</p>
<pre><code>>>> # ================================================================
... # === ShallowCopy.py =============================================
... # ================================================================
... #
... class Foo:
... def __init__(self, data):
... self._data = data
...
>>> aa = Foo ('aaa')
>>> bb = Foo ('bbb')
>>>
>>> # The initial list has two elements containing 'aaa' and 'bbb'
... OldList = [aa,bb]
>>> print OldList[0]._data
aaa
>>>
>>> # The shallow copy makes a new list pointing to the old elements
... NewList = OldList[:]
>>> print NewList[0]._data
aaa
>>>
>>> # Updating one of the elements through the new list sees the
... # change reflected when you access that element through the
... # old list.
... NewList[0]._data = 'xxx'
>>> print OldList[0]._data
xxx
>>>
>>> # Updating the new list to point to something new is not reflected
... # in the old list.
... NewList[0] = Foo ('ccc')
>>> print NewList[0]._data
ccc
>>> print OldList[0]._data
xxx
</code></pre>