代码之家  ›  专栏  ›  技术社区  ›  JavaSa

python对象引用和深度复制

  •  0
  • JavaSa  · 技术社区  · 7 年前

    我突然有点困惑,我现在可能累了,所以这可能是原因。

    无论如何,请考虑使用以下解释程序:

    > x = {'hello':'world'}
    > y=x
    
    > x= None
    
    >y
    y={'hello':'world'}
    

    为什么不呢? y = None 不是 y 现在是否在更改后引用与x相同的值?

    第二个问题:
    有什么区别:

    x= {'test':1}
    y = dict(x)
    VS  
    y = copy.deepcopy(x)
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   James    7 年前

    在这种情况下,Dictionary对象 {'hello': 'world'} 在内存中创建,然后 x 被指定为对它的引用。指派 y=x 指定一个 第二 引用Dictionary对象,这次 y .

    然而, Y 不是指向的指针 X . 再赋值 X 不会改变什么 Y 被引用。


    对于您的第二个问题,在这个特定的案例中,没有区别。

    使用:

    x = {'test':1}
    y = dict(x)
    

    创建词典的新副本并将其分配给 Y .

    使用:

    y = copy.deepcopy(x)
    

    创建相同的副本。你会看到的区别是字典的值是一个可变的对象,比如一个列表。

    在这里, Y 是一个肤浅的副本 X :

    x = {'test': [1,2,3]}
    y = dict(x)
    

    因此,更改Dictionary对象中由引用的列表 X 也将出现在 Y 也。

    x['test'][1] = 0
    y
    # returns:
    {'test': [1, 0, 2]}
    

    然而,使用:

    x = {'test': [1,2,3]}
    y = copy.deepcopy(x)
    

    将创建主对象及其包含的所有对象的副本。所以现在修改列表 X 不会改变 Y .

    x['test'][1] = 0
    y
    # returns
    {'test': [1,2,3]}