时间:2022-04-29 点击: 次 来源:网络 作者:佚名 - 小 + 大
老余零基础学python的学习方法第71天零基础学pythonppt豆瓣
下载地址 https://share.weiyun.com/S11bpehi
资料目录 小甲鱼零基础学python视频全套96集 刘金玉零基础python入门到精通教程100集全套VIP精选 跟老齐学Python从入门到精通 电子工业出版社 在一般的理解中,copy就是将原来的东西再做一份。但是,在Python里面(乃至于很多编程语言中),copy可不是那么简单的。 >>> a = 5 >>> b = a >>> b 5 这样做是不是就得到了两个5了呢?表面上看似乎是,但是,不要忘记在前面反复提到的:对象有类型,变量无类型,正是因为这句话,变量其实是一个标签。不妨请出法宝:id(),专门查看内存中的对象编号。 >>> id(a) 139774080 >>> id(b) 139774080 果然,并没有两个5,就一个,只不过是贴了两张标签而已。这种现象普遍存在于Python的多种数据类型中。其他的就不演示了,就仅看看dict类型。 >>> ad = {"name":"qiwsir", "lang":"python"} >>> bd = ad >>> bd {'lang': 'python', 'name': 'qiwsir'} >>> id(ad) 3072239652L >>> id(bd) 3072239652L 又是一个对象贴了两个标签,这是用赋值的方式实现的所谓“假装拷贝”。那么如果用copy的方法呢? >>> cd = ad.copy() >>> cd {'lang': 'python', 'name': 'qiwsir'} >>> id(cd) 3072239788L 这次得到的cd跟原来的ad是不同的,它在内存中另辟了一个空间。 如果我尝试修改cd,应该对原来的ad不会造成任何影响。 >>> cd["name"] = "itdiffer.com" >>> cd {'lang': 'python', 'name': 'itdiffer.com'} >>> ad {'lang': 'python', 'name': 'qiwsir'} 真的跟推理一模一样。所以,只要理解了“变量”是对象的标签,对象有类型而变量无类型,就能正确推断出Python能够提供的结果。刚才已经看到了,bd和ad引用了同一个内存对象。 >>> bd {'lang': 'python', 'name': 'qiwsir'} >>> bd["name"] = "laoqi" >>> ad {'lang': 'python', 'name': 'laoqi'} >>> bd {'lang': 'python', 'name': 'laoqi'} 修改了bd所对应的“对象”,ad的“对象”也变了。 然而,事情并没有那么简单,下面看仔细一点,否则就迷茫了。 >>> x = {"name":"qiwsir", "lang":["python", "java", "c"]} >>> y = x.copy() >>> y {'lang': ['python', 'java', 'c'], 'name': 'qiwsir'} >>> id(x) 3072241012L >>> id(y) 3072241284L y是从x拷贝过来的,两个在内存中是不同的对象。 >>> y["lang"].remove("c") 在y所对应的字典对象中,键"lang"的值是一个列表,为['python','java','c'],这里用remove()删除其中的一个元素"c"。删除之后,这个列表变为:['python','java']。 >>> y {'lang': ['python', 'java'], 'name': 'qiwsir'} 那么,x所对应的字典中,这个列表变化了吗?应该没有变化,因为按照前面所讲的,它是另外一个对象,两个互不干扰。 >>> x {'lang': ['python', 'java'], 'name': 'qiwsir'} 仔细观察,是不是有点出乎意料呢?我没有作弊哦。如果不信,就按照操作自己在交互模式中试试,是不是也能够得到这个结果呢?这是为什么? 但是,如果要操作另外一个键值对: >>> y["name"] = "laoqi" >>> y {'lang': ['python', 'java'], 'name': 'laoqi'} >>> x {'lang': ['python', 'java'], 'name': 'qiwsir'} 前面所说的原理是有效的,为什么当值是列表的时候就不奏效了呢? 要破解这个迷局还得用id(): >>> id(x) 3072241012L >>> id(y) 3072241284L x和y对应着两个不同的对象,的确如此。但这个对象(字典)是由两个键值对组成的,其中一个键的值是列表。 >>> id(x["lang"]) 3072243276L >>> id(y["lang"]) 3072243276L 发现了这样一个事实:列表是同一个对象。 但是,作为字符串为值的那个键值对分属不同的对象。 >>> id(x["name"]) 3072245184L >>> id(y["name"]) 3072245408L 这个事实就说明了为什么修改一个列表,另外一个也跟着修改;而修改一个字符串,另外一个不跟随的原因了。 |
上一篇:零基础学python爬虫数据分析与可视化从入门到精通pdf下载
下一篇:没有了