Python:编写一个函数来测试list1是否是list2的浅拷贝

Python:编写一个函数来测试list1是否是list2的浅拷贝,python,list,deep-copy,shallow-copy,Python,List,Deep Copy,Shallow Copy,为了测试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:

为了测试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的深度副本,我应该做什么修改

谢谢

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))
很难准确地定义
检查深度\u复制
应该做什么。 例如,如果所有对象都是不可变的,则深度副本可能与浅层副本完全相同

很难准确地定义
检查深度\u复制
应该做什么。
例如,如果所有对象都是不可变的,则深度副本可能看起来与浅层副本完全相同。

让我解释一下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是否是具有相同字段值的不同对象。如果需要,将==替换为用户定义的比较函数

让我解释一下格尼布尔的所作所为

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是否是具有相同字段值的不同对象。如果需要,将==替换为用户定义的比较函数

无邮政编码:

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))) 

无邮政编码:

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))) 

[“f”、“o”、“o”]
[“f”、“o”、“o”、“x”]
为假阳性。。。你也需要检查长度。棒极了,很简单!向上投票。谢谢你的帮助!然而,在课堂上,我还没有学会zip函数,我们只需要实现我们所学的东西。因此,在不偏离上面代码太远的情况下,如果我只在for循环中使用all(id(lst1[idx])==id(lst2[idx]),这是否也可以工作?再次感谢!
[“f”、“o”、“o”]
[“f”、“o”、“o”、“x”]
为假阳性。。。你也需要检查长度。棒极了,很简单!向上投票。谢谢你的帮助!然而,在课堂上,我还没有学会zip函数,我们只需要实现我们所学的东西。因此,在不偏离上面代码太远的情况下,如果我只在for循环中使用all(id(lst1[idx])==id(lst2[idx]),这是否也可以工作?再次感谢!谢谢你的澄清!非常感谢:)谢谢你的澄清!非常感谢:)