代码之家  ›  专栏  ›  技术社区  ›  Marcus Whybrow

python通过赋值复制?

  •  39
  • Marcus Whybrow  · 技术社区  · 14 年前

    我希望下面的代码只是初始化 dict_a , dict_b dict_c 字典。但它似乎具有复制效果:

    dict_a = dict_b = dict_c = {}
    dict_c['hello'] = 'goodbye'
    
    print dict_a
    print dict_b
    print dict_c
    

    如您所见,结果如下:

    {'hello': 'goodbye'}
    {'hello': 'goodbye'}
    {'hello': 'goodbye'}
    

    为什么这个程序会给出先前的结果,而我希望它会返回:

    {}
    {}
    {'hello': 'goodbye'}
    
    4 回复  |  直到 10 年前
        1
  •  37
  •   Pyrocater danben    10 年前

    这是因为在python中,变量(名称)只是对单个对象的引用。当您分配 dict_a = dict_b ,实际上是从 dict_b dict_a . 那本字典还有一个例子。

    要获得所需的行为,请使用 dict.copy 方法或使用 copy.deepcopy 如果dict可能有嵌套dict或其他嵌套对象。

    >>> a = {1:2}
    >>> b = a.copy()
    >>> b
    {1: 2}
    >>> b[3] = 4
    >>> a
    {1: 2}
    >>> b
    {1: 2, 3: 4}
    >>> 
    
        2
  •  8
  •   Jeffrey Jose    14 年前

    尽管

    >>> dict_a, dict_b, dict_c = {}, {}, {}
    

    在大多数情况下都是正确的方法,当它超过3个时看起来很奇怪

    想象

    >>> a, b, c, d, e, f = {}, {}, {}, {}, {}, {}
    

    如果我想初始化3个以上的东西,我使用

    >>> a, b, c, d, e, f, = [dict() for x in range(6)]
    

    注意安全 不要使用 [{} for x in range(6)]

        3
  •  2
  •   mdeous    14 年前

    正如danben之前所说,您只需将同一个dict复制到3个变量中,以便每个变量都引用同一个对象。

    要获得所需的行为,应在每个变量中实例化不同的dict:

    >>> dict_a, dict_b, dict_c = {}, {}, {}
    >>> dict_c['hello'] = 'goodbye'
    >>> print dict_a
    {}
    >>> print dict_b
    {}
    >>> print dict_c
    {'hello': 'goodbye'}
    >>>
    
        4
  •  1
  •   msalib    14 年前

    第一个赋值将相同的dictionary对象分配给变量dict_a、dict_b和dict_c。它相当于dict_c={};dict_b=dict_c;dict_a=dict_c。