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

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

Code1

结果:

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

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

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

Code2

结果:

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

这里仍然是相同的

再改:

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

Code3

 d['c'] = ['a','c', 'shallow']
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}

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

 d = {'b': 2, 'a': 3, 'c': ['a', 'c']}
b = d.copy() d['c'].append(123)
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仍然那个字典,所以两者都改变了。

python字典copy()方法的更多相关文章

  1. Python 字典 copy()方法

    描述 Python 字典 copy() 方法返回一个字典的浅拷贝(父不变,子变). 语法 copy() 方法语法: D.copy() 参数 无. 返回值 返回一个字典的浅拷贝(父不变,子变). 实例 ...

  2. Python 字典 fromkeys()方法

    Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对象中的元素分别作为字典中的键,且所有键对应同一个值,默认为None. fromkeys() 方法语法: 1 dict.f ...

  3. Python 字典 popitem() 方法

    描述 Python 字典 popitem() 方法随机返回并删除字典中的一个键/值对(一般删除末尾对). 如果字典已经为空,却调用了此方法,就报出KeyError异常. 语法 popitem() 方法 ...

  4. Python 字典 pop() 方法

    描述 Python 字典 pop() 方法删除给定键所对应的键/值对,并返回被删除的值.给定键如果不在字典中,则必须设置一个default值,否则会报错,此时返回的就是default值. 语法 pop ...

  5. Python 字典 values() 方法

    描述 Python 字典 values() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有值. 语法 values() 方法语法: D.values() 参数 无 ...

  6. Python 字典 update() 方法

    描述 Python 字典 update() 方法用于更新字典中的键/值对,可以修改存在的键对应的值,也可以添加新的键/值对到字典中. 用法与 Python dict() 函数相似. 语法 update ...

  7. Python 字典 keys() 方法

    描述 Python 字典 keys() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有的键. 语法 keys() 方法语法: D.keys() 参数 无. 返回值 ...

  8. Python 字典 items() 方法

    描述 Python 字典 items() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回可遍历的(键, 值) 元组数组. 语法 items() 方法语法: D.items() ...

  9. Python 字典 clear()方法

    描述 Python 字典 clear() 方法用于删除字典内所有元素. 语法 clear() 方法语法: D.clear() 参数 无. 返回值 该方法没有任何返回值. 实例 以下实例展示了 clea ...

随机推荐

  1. Hive(六):HQL DDL

    HQL语法基于 SqlLine(http://sqlline.sourceforge.net/),DDL主要包含数据库.函数.视图的创建.修改.删除,参考资料:(https://cwiki.apach ...

  2. Phonegap通过JS访问本地接口的两种方法

    Phonegap为跨设备的应用开发提供了一个解决方案.如果某个应用只有js和html,则可以通过Phonegap的在线build工具,编译出多个平台的app安装包.当然通过Phonegap提供的js可 ...

  3. Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应

    在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: function Sure(obj) { var statu ...

  4. css3之transform的应用

    一.利用transform实现图片额外显示 效果图如下 初始状态:

  5. 剑指offer系列23---字符串排列(不是很理解)

    [题目]输入一个字符串,按字典序打印出该字符串中字符的所有排列. 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺 ...

  6. Redis服务停止报错解决方案[NOAUTH Authentication required]

    Redis服务器设置密码后,使用service redis stop 会出现以下信息: service redis stop Stopping ... OK (error) NOAUTH Authen ...

  7. 浅析:setsockopt()改善socket网络程序的健壮性

    1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BO ...

  8. [备忘]Visio中连接线交叉时跨线小弯的去掉方法

    连接线格式->行为->连接线->跨线->添加->从不 format->behavior…->Connector->Line jumps->Add: ...

  9. android fragment getActivity()为空的另一个可能

    目前这个方法得到空指针一般来说是因为Activity被销毁导致无法获取,但是开发中又出了一个低级错误导致getActivity为空. 因为我在Fragment的构造函数中调用这个方法了..此时Acti ...

  10. Hibernate第一个程序

    1. 下载资源:www.hibernate.org 2. 资源介绍hibernate-release-4.3.10.Final a) Documentation  相关文档 b) Lib 相关jar包 ...