zoukankan      html  css  js  c++  java
  • python字典copy()方法

    python 字典的copy()方法表面看就是深copy啊,明显独立

    1 d = {'a':1, 'b':2}
    2 c = d.copy()
    3 print('d=%s  c=%s' % (d, c))
    Code1

    结果:

    d={'a': 1, 'b': 2}  c={'a': 1, 'b': 2}

    修改d,看看c变化没有。

    1 d['a']=3
    2 print('d=%s  c=%s' % (d, c))
    Code2

    结果:

    d={'a': 3, 'b': 2}  c={'a': 3, 'b': 2}

    这里仍然是相同的

    再改:

    1 d = {'b': 2, 'a': 3, 'c': ['a', 'c']}
    2 b = d.copy()
    3 print('d=%s  b=%s' % (d, b))
    Code3
    1 d['c'] = ['a','c', 'shallow']
    2 print('d=%s  b=%s' % (d, b))
    Code4

    code4 中重新对d['c']赋值了,发现结果是不相同的

    d={'a': 3, 'c': ['a', 'c', 'shallow'], 'b': 2} b={'a': 3, 'c': ['a', 'c'], 'b': 2}

    但是,这里的修改是重新赋值,如果直接对其进行修改呢?

    1 d = {'b': 2, 'a': 3, 'c': ['a', 'c']}
    2 b = d.copy()
    3 
    4 d['c'].append(123)
    5 print('d=%s  b=%s' % (d, b))
    Code5

    结果:

    d={'b': 2, 'c': ['a', 'c', 123], 'a': 3} b={'b': 2, 'c': ['a', 'c', 123], 'a': 3}

    发现两者并不是完全独立的,这就是“浅拷贝”的由来。

    那么,问题来了:为什么对d重新赋值时c没有改变,而对d直接修改时c又改变了呢?

    说到底还是python的机制问题,因为赋值操作都是在引用。

    开始d,c引用同一个字典,当对d重新赋值后,c还指向原来的字典,但d引用已经改变,所以两都独立。

    但是,当我在原字典的基础上直接修改c的value值(一个列表)。

    此时d,c仍然那个字典,所以两者都改变了。

  • 相关阅读:
    8.5 exit函数进程控制
    8.2 进程标识
    8.6 wait和waitpid函数进程控制
    2.jpg
    8.3 fork函数进程控制
    8.4 vfork函数进程控制
    8.9 竞态条件
    8.8 wait3和wait4函数进程控制
    8.7 waitid函数进程控制
    Silverlight Tools 3.0中文正式版发布(附下载地址)
  • 原文地址:https://www.cnblogs.com/Andy963/p/5332547.html
Copyright © 2011-2022 走看看