0

为了测试 lst1 是否是 lst2 的浅拷贝,我这样做了:

def check_shallow_copy(lst1, lst2):
''' Return True if lst1 is a shallow copy of lst2.
Return False if not.
'''

for idx in range(len(lst1)):

    if lst1 == lst2 and id(lst1[idx]) == id(lst2[idx]) and lst1 is not lst2:
        return True
    else:
        return False

但是,如果两个列表共享第一个元素的副本,但不共享其他任何元素,我认为这不会起作用。如何更改函数以使所有索引的 id(lst1[idx]) 必须与 id(lst2[idx]) 相同?

另外,对于浅拷贝和深拷贝的区别,我还是有点模糊。如果我想让这个函数测试 lst1 是否是 lst2 的深层副本,我应该做哪些修改?

谢谢!

4

3 回答 3

3
def check_shallow_copy(lst1, lst2):
    if lst1 is lst2 or len(lst1) != len(lst2):
        return False
    return all(x is y for x, y in zip(lst1, lst2))

很难准确定义check_deep_copy应该做什么。例如,如果所有对象都是不可变的,那么深拷贝可能看起来与浅拷贝完全一样。

于 2013-07-18T02:03:28.807 回答
1

让我稍微解释一下 gnibbler 做了什么。

def check_shallow_copy(lst1, lst2):
    return lst1 is not lst2 and 
           all([x is y for x, y in zip(lst1, lst2)])

zip 函数接受两个列表并返回一个元组列表 (ele1, ele2),其中 ele1 来自 lst1,ele2 来自 lst2,保持顺序。

如果两个操作数是同一个对象,“is”操作返回 true。

当有人说 A 是 B 的浅拷贝时,它实际上意味着 A 和 B 共享相同的对象集作为它们的字段。硬拷贝意味着字段具有相同的值,但是是不同的对象。

“同一个对象”可能会很混乱。我通常认为它是低级内存地址的等价物。如果两个对象的字段具有相同的内存地址,则它们是彼此的浅拷贝。但是,Python 不保证“is”会比较内存地址。

为了测试它是否是硬拷贝,

def check_hard_copy(lst1, lst2):
    return lst1 is not lst2 and 
           all([x is not y and x == y for x, y in zip(lst1, lst2)])

在这个函数中,我们检查 x 和 y 是否是具有相同字段值的不同对象。如果需要,将 == 替换为用户定义的比较函数。

于 2013-07-18T02:25:47.023 回答
1

没有zip

def check_shallow_copy(lst1, lst2):
    if lst1 is lst2 or len(lst1) != len(lst2):
        return False
    return all(lst1[i] is lst2[i] for i in range(len(lst1))) 
于 2013-07-18T02:35:45.063 回答