您正在体验的是引用的概念。Python中的所有对象都有一个引用,当您将一个名称分配给两个名称
a和时
b,这将导致两者
a并
b指向 _同一_对象。
>>> a = range(3)>>> b = a # same object>>> b.append(3)>>> a, b# same contents([0, 1, 2, 3], [0, 1, 2, 3])
随着名单,你可以创建一个新的列表
b是一个 副本, 另一个
a使用
b = a[:]。
>>> a = range(3)>>> b = a[:] # make b a new copy of a>>> b.append(3)>>> a, b# a is left unchanged([0, 1, 2], [0, 1, 2, 3])
有关任何对象的更通用解决方案,请使用copy模块。浅表副本将复制要复制的对象中存储的引用,而深表副本将递归地创建所有对象的新副本。
>>> a = [range(2), range(3)]>>> b = copy.copy(a) # shallow copy of a, equivalent to a[:]>>> b[0] = range(4)>>> a, b# setting an element of b leaves a unchanged([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])>>> b[1].append(3)>>> a, b# modifying an element of b modifies the element in a([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])>>> a = [range(2), range(3)]>>> b = copy.deepcopy(a) # deep recursive copy of a>>> b[1].append(3)>>> a, b# modifying anything in b leaves a unchanged([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])



