使用os.path.exists()可以判断文件或者文件夹是否存在,方法很简单,括号中放入需要判断的路径即可,如下
但这种时候容易混淆文件夹和文件,所以可以采用如下命令只检查文件,同样返回布尔型变量
如果文件不存在,直接用open()函数会抛出异常,这时候只要try一下并获取异常即可,如下
上面包含了文件不存在和文件不可读取两种错误类型,这两种都属于IO error,简化一下有,
主要是通过文件的路径来创建path对象,进而判断路径是否存在,如下
(想到这些简单的知识都似曾相识,为什么要零散地记录呢
参考资料: https://www.py.cn/faq/python/12821.html
‘贰’ Python 解决你的实际问题可以在哪些地方找资料
Python 标准库:
应该浏览一下这份文档,它为标准库中的类型、函数和模块提供了完整(尽管很简略)的参考资料。标准的 Python 发布版包括了 大量 的附加模块。其中有针对读取 Unix 邮箱、接收 HTTP 文档、生成随机数、解析命令行选项、写 CGI 程序、压缩数据以及很多其它任务的模块。略读一下库参考会给你很多解决问题的思路。
安装 Python 模块 展示了如何安装其他 Python 用户编写的附加模块。
Python 语言参考: 详细说明了 Python 语法和语义。
它读起来很累,不过对于语言本身,有份完整的手册很有用。
其它 Python 资源:
http://www.python.org: Python 官方网站。它包含代码、文档和 Web 上与 Python 有关的页面链接该网站镜像于全世界的几处其它问题,类似欧洲、日本和澳大利亚。
镜像可能会比主站快,这取决于你的地理位置。
http://docs.python.org: 快速访问 Python 的文档。
http://pypi.python.org: Python 包索引,以前昵称为奶酪店,索引了可供下载的,用户创建的 Python 模块。如果你发布了代码,可以注册到这里,这样别人可以找到它。
http://code.activestate.com/recipes/langs/python/: Python 食谱是大量的示例代码、大型的集合,和有用的脚本。
值得关注的是这次资源已经结集成书,名为《Python 食谱》(O’Reilly & Associates, ISBN 0-596-00797-3。)
http://scipy.org: The Scientific Python 项目包括数组快速计算和处理模块,和大量线性代数、傅里叶变换、非线性solvers、随机数分布,统计分析以及类似的包。
与 Python 有关的问题,以及问题报告,可以发到新闻组 comp.lang.python ,或者发送到邮件组 [email protected] 。新闻组和邮件组是开放的,所以发送的消息可以自动的跟到另一个之后。每天有超过 120 个投递(高峰时有数百),提问(以及回答)问题,为新功能提建议,发布新模块。在发信之前,请查阅 常见问题 (亦称 FAQ),或者在 Python 源码发布包的 Misc/ 目录中查阅。邮件组也可以在 http://mail.python.org/pipermail/ 访问。FAQ回答了很多被反复提到的问题,很可能已经解答了你的问题。
Next Previous
‘叁’ 如何在python(或特定大小的数组)中声明0数组
只是为了安全起见:如果你要在python中声明一个多维的0列表,你必须使用像这样的列表:
buckets = [[0 for col in range(5)] for row in range(10)]
以避免引用共享。
有关更多详细信息,请参阅Python FAQ。
‘肆’ python如何垂直输出
我们都知道使用print函数可以输出内容,那么怎么才能向下垂直输出呢?
Python的print()函数输出时,通常输出结果是整行显示出来的,这时候我们需要考虑一下,我们输出的结果需不需要换行?
不需要换行的方法也是嗯容易的的,这里就不多赘述了,来说说如何做到输出换行:
常用的转义符方式:\n
输出结果
原文至:https://www.py.cn/faq/python/14976.html
‘伍’ python中有switch语句吗
python官网的回答(地址:https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python):
You can do this easily enough with a sequence of if... elif... elif... else.
意思就是:python语法讲究简单明了,if else完全可以很简单的实现switch的所有功能,没必要用switch。
‘陆’ python 的源代码是否可以用于商业目的
如何成为一名黑客
什么是黑客?
Jargon File中对“黑客”一词给出了很多个定义,大部分定义都涉及高超的编程技术,强烈的解决问题和克服限制的欲望。如果你想知道如何成为一名黑客,那么好,只有两方面是重要的。(态度和技术)
长久以来,存在一个专家级程序员和网络高手的共享文化社群,其历史可以追溯到几十年前第一台分时共享的小型机和最早的ARPAnet实验时期。 这个文化的参与者们创造了“黑客”这个词。 黑客们建起了Internet。黑客们使Unix操作系统成为今天这个样子。黑客们搭起了Usenet。黑客们让WWW正常运转。如果你是这个文化的一部分,如果你已经为它作了些贡献,而且圈内的其他人也知道你是谁并称你为一个黑客,那么你就是一名黑客。
黑客精神并不仅仅局限于软件黑客文化圈中。有些人同样以黑客态度对待其它事情如电子和音乐---事实上,你可以在任何较高级别的科学和艺术中发现它。软件黑客们识别出这些在其他领域同类并把他们也称作黑客---有人宣称黑客实际上是独立于他们工作领域的。 但在本文中,我们将注意力集中在软件黑客的技术和态度,以及发明了“黑客”一词的哪个共享文化传统之上。
另外还有一群人,他们大声嚷嚷着自己是黑客,实际上他们却不是。他们是一些蓄意破坏计算机和电话系统的人(多数是青春期的少年)。真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。多数真正的黑客认为骇客们是些不负责任的懒家伙,还没什么大本事。专门以破坏别人安全为目的的行为并不能使你成为一名黑客, 正如拿根铁丝能打开汽车并不能使你成为一个汽车工程师。不幸的是,很多记者和作家往往错把“骇客”当成黑客;这种做法激怒真正的黑客。
根本的区别是:黑客们建设,而骇客们破坏。
如果你想成为一名黑客,继续读下去。如果你想做一个骇客,去读 alt.2600 新闻组,并在发现你并不像自己想象的那么聪明的时候去坐5到10次监狱。 关于骇客,我只想说这么多。
---黑客的态度
黑客们解决问题,建设事物,信仰自由和双向的帮助,人人为我, 我为人人。
要想被认为是一名黑客,你的行为必须显示出你已经具备了这种态度。要想做的好象你具备这种态度,你就不得不真的具备这种态度。但是如果你想靠培养黑客态度在黑客文化中得到承认,那就大错特错了。因为成为具备这些特质的这种人对你自己非常重要,有助于你学习,并给你提供源源不断的活力。同所有有创造性的艺术一样,成为大师的最有效方法就是模仿大师的精神---不是仅从理智上,更要从感情上进行模仿。
So,如果你想做一名黑客,请重复以下事情直到你相信它们:
1 这世界充满待解决的迷人问题
做一名黑客有很多乐趣,但却是些要费很多气力方能得到的乐趣。 这些努力需要动力。成功的运动员从健壮体魄,挑战自我极限中汲取动力。同样,做黑客,你必须
要有从解决问题,磨练技术,锻炼智力中得到基本的热望。如果你还不是这类人又想做黑客,你就要设法成为这样的人。否则你会发现,你的黑客热情会被其他诱惑无情地吞噬掉---如金钱、性和社会上的虚名。
(同样你必须对你自己的学习能力建立信心---相信尽管你对某问题所知不多,但如果你一点一点地学习、试探,你最终会掌握并解决它。)
2. 一个问题不应该被解决两次
聪明的脑瓜是宝贵的,有限的资源。当这个世界还充满其他有待解决的有趣问题之时,他们不应该被浪费在重新发明轮子这些事情上。 作为一名黑客,你必须相信其他黑客的思考时间是宝贵的---因此共享信息,解决问题并发布结果给其他黑客几乎是一种道义,这样其他人就可以去解决新问题而不是重复地对付旧问题。
(你不必认为你一定要把你的发明创造公布出去,但这样做的黑客是赢得大家尊敬最多的人。卖些钱来给自己养家糊口,买房买车买计算机甚至发大财和黑客价值也是相容的,只要你别忘记你还是个黑客。)
3. 无聊和乏味的工作是罪恶
黑客们应该从来不会被愚蠢的重复性劳动所困扰,因为当这种事情发生时就意味着他们没有在做只有他们才能做的事情---解决新问题。这样的浪费伤害每一个人。因此,无聊和乏味的工作不仅仅是令人不舒服而已,它们是极大的犯罪。 要想做的象个黑客,你必须完全相信这点并尽可能多地将乏味的工作自动化,不仅为你自己,也为了其他人(尤其是其他黑客们)。
(对此有一个明显的例外。黑客们有时也做一些重复性的枯燥工作以进行“脑力休息”,或是为练熟了某个技巧,或是获得一些除此无法获得的经验。但这是他自己的选择---有脑子的人不应该被迫做无聊的活儿。)
4 自由就是好
黑客们是天生的反权威主义者。任何能向你发命令的人会迫使你停止解决令你着迷的问题,同时,按照权威的一般思路,他通常会给出一些极其愚昧的理由。因此,不论何时何地,任何权威,只要他压迫你或其他黑客,就要和他斗到底。
(这并非说任何权力都不必要。儿童需要监护,罪犯也要被看管起来。 如果服从命令得到某种东西比起用其他方式得到它更节约时间,黑客会同意接受某种形式的权威。但这是一个有限的、特意的交易;权力想要的那种个人服从不是你的给予,而是无条件的服从。)
权力喜爱审查和保密。他们不信任自愿的合作和信息共享---他们只喜欢由他们控制的合作。因此,要想做的象个黑客,你得对审查、保密,以及使用武力或欺骗去压迫人们的做法有一种本能的反感和敌意。
5. 态度不能替代能力
要做一名黑客,你必须培养起这些态度。但只具备这些态度并不能使你成为一名黑客,就象这并不能使你成为一个运动健将和摇滚明星一样。成为一名黑客需要花费智力,实践,奉献和辛苦。
因此,你必须学会不相信态度,并尊重各种各样的能力。黑客们不会为那些故意装模做样的人浪费时间,但他们却非常尊重能力---尤其是做黑客的能力,不过任何能力总归是好的。具备很少人才能掌握的技术方面的能力尤其为好,而具备那些涉及脑力、技巧和聚精会神的能力为最好。
如果你尊敬能力,你会享受提高自己能力的乐趣---辛苦的工作和奉献会变成一种高度娱乐而非贱役。 要想成为一名黑客,这一点非常重要。
基本黑客技术
黑客态度是重要的,但技术更加重要。态度无法替代技术,在你被别的黑客称为黑客之前,有一套基本的技术你必须掌握。 这套基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。例如,过去包括使用机器码编程,而知道最近才包括了HTML语言。但现在明显包括以下技术:
1 学习如何编程
这当然是最基本的黑客技术。如果你还不会任何计算机语言,我建议你从Python开始。它设计清晰,文档齐全,对初学者很合适。尽管是一门很好的初级语言,它不仅仅只是个玩具。它非常强大,灵活,也适合做大型项目。
但是记住,如果你只会一门语言,你将不会达到黑客所要求的技术水平,甚至也不能达到一个普通程序员的水平---你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。要做一名真正的黑客,你需要学会如何在几天内通过一些手册,结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种不同的语言。
如果要做一些重要的编程,你将不得不学习C语言,Unix的核心语言。其他对黑客而言比较重要的语言包括Perl和LISP。 Perl很实用,值得一学;它被广泛用于活动网页和系统管理,因此即便你从不用Perl写程序,至少也应该能读懂它。 LISP 值得学习是因为当你最终掌握了它你会得到丰富的经验;这些经验使你在以后的日子里成为一个更好的程序员,即使你实际上可能很少使用LISP本身。
当然,实际上你最好四种都会。 (Python, C, Perl, and LISP). 除了是最重要的四种基本语言,它们还代表了四种非常不同的编程方法,每种都会让你受益非浅。
这里我无法完整地教会你如何编程---这是个复杂的活儿。但我可以告诉你,书本和课程也不能作到。几乎所有最好的黑客都是自学成材的。真正能起作用的就是去亲自读代码和写代码。
学习如何编程就象学习用自然语言写作一样。最好的做法是读一些大师的名着,试着自己写点东西,再读些,再写点,又读些,又写点....如此往复,直到你达到自己在范文中看到的简洁和力量。
过去找到好的代码去读是困难的,因为很少有大型程序的可用源代码能让新手练手。这种状况已经得到了很大的改善;现在有很多可用的开放源码软件,编程工具和操作系统(全都有黑客写成)。这使我们自然地来到第二个话题...
2 得到一个开放源码的Unix并学会使用、运行它
我假设你已经拥有了一台个人计算机或者有一个可用的( 今天的孩子们真幸福 :-) )。新手们最基本的一步就是得到一份Linux或BSD-Unix,安装在个人计算机上,并运行它。
当然,这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发送的---你无法读到它的源码,更不可能修改它。尝试在DOS或Windows的机器上学习黑客技术,就象是在腿上绑了铁块去学跳舞。
除此之外,Unix还是Internet的操作系统。你可以不知道Unix而学会用Internet,但不懂它你就无法成为一名Internet黑客。因为这个原因,今天的黑客文化在很大程度上是以Unix为中心的。(这点并不总是真的,一些很早的黑客对此很不高兴,但Unix和Internet之间的共生关系已是如此之强,甚至连微软也无可奈何)
So,装一个Unix---我个人喜欢Linux,不过也有其他选择。(你也可以在同一台机器上同时运行DOS,Windows和Linux)学会它。运行它。用它跟Internet对话。读它的代码。试着去修改他。你会得到比微软操作系统上好的多的编程工具(包括C,Lisp, Python, and Perl),你会得到乐趣,并将学到比你想象的更多知识。
关于学习Unix的更多信息,请看 The Loginataka.
要得到Linux,请看: 哪里能得到 Linux.
3 学会如何使用WWW和写HTML
大多黑客文化建造的东西都在你看不见的地方发挥着作用,帮助工厂、办公室和大学正常运转,表面上很难看到它对他人的生活的影响。Web是一个大大的例外。即便政客也同意,这个巨大而耀眼的黑客玩具正在改变整个世界。单是这个原因(还有许多其它的), 你就需要学习如何掌握Web。
这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写HTML,Web的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。因此,先建起自己的主页。
但仅仅建一个主页也不能使你成为一名黑客。 Web里充满了各种网页。多数是无意义的,零信息量垃圾。
要想有价值,你的网页必须有内容---必须有趣或对其它黑客有用。这样,我们来到下一个话题....
黑客文化中的地位大教堂与集市”,解释了许多Linux和开放源码文化的运做原理。我还在它的续集“大教堂与集市”,解释了许多Linux和开放源码文化的运做原理。我还在它的续集“开拓智域”一文中有更直接的论述。
FAQ(常问问题解答)
问:你会教我如何做黑客吗?
自从第一次发布此页,我每周都会得到一些请求,要我“教会他如何做黑客”;遗憾的是,我没有足够的时间和精力来做这个;我自己的编程项目已经占用了我110%的时间。
甚至即便我想教你也不可能,黑客基本上是一项需要你自行修炼的的态度和技术。你会发现即使真正的黑客想帮助你,如果你乞求他们填鸭一样教你的话,你不会赢得他们的尊敬。
首先去学习。显示你在尝试,你能靠自己去学习。然后再去向黑客们请教问题。
问:你会帮我“黑”掉一个站点吗?或者教我怎么黑它?
No. 任何在读完FAQ后还问此问题人,都是愚不可及的家伙,即使有时间我也不会理睬。 任何发给我的此类mail都会被忽略或被痛斥。
问:哪里能找到真正的可以与之交流的黑客?
最佳办法是就近参加一个Unix或Linux的用户组,参加他们的会议。
问:我该先学哪种语言?
HTML, 如果你还不会的话.
但它不是一个真正的编程语言。当你准备编程时,我建议你从 Python开始. 会有很多人向你推荐Perl,它比Python还受欢迎,但却难学一些。
C 是非常重要的,但它却是最难学的。不要一开始就尝试学C。
问:开放源码的自由软件不会使程序员饿肚子吗?
这似乎不大可能---到目前,开放源码软件产业创造了而不是消灭了大量工作机会。
如果写一个程序比不写一个程序只是个纯粹经济上的收益的话,无论它是否免费,只要它被完成,程序员都会从中得到回报。而且,无论软件是由多么的free的方法开发的,对更新的软件应用的需求总是会有的。
问:我从何学起?哪里有免费的Unix?
本页的其他地方指向最常用的免费Unix。要做一名黑客,你需要自立自强,以及自我教育的能力。
现在开始吧......
参考资料:
‘柒’ 微软官方上线 Python 教程
微软近日上线了一套 Python 教程《Develop with Python on Windows》,文档内容包括设置 Python 开发环境、在 Windows 与 WSL 子系统中安装相应开发工具,以及集成 VS Code 与 Git 工具并进行开发等。
具体来看,课程有以下几个章节:
相应章节的内容都比较详细,值得一提的是 FAQ,学习 Python 的人肯定会被 Python 的各种各样的问题困扰,在 FAQ 中,有一些常见问题的详细解答,比如:
Python 正在变得越来越受欢迎,这点毋庸置疑,单单看一下我们近期跟踪的 TIOBE 编程语言排行榜,连续几个月榜单的焦点都在 Python 上:
现在微软官方都出了 Python 教程,看来这把火又要再烈一些了,你觉得呢?
教程地址:“链接”
‘捌’ 谁知道这个python数据分析教程是哪个机构的吗或者有资源的! 非常感谢
使用Python进行数据挖掘是最近几年才开始火起来的,之前网上很多的资料都是关于Python网页开发等。但使用Python进行数据挖掘的侧重点已经完成不一样了。本人就是浪费了很多时间来筛选这些博客、书籍。所以就有了本文,希望能帮大家少走一点弯路。
熟练掌握任何一门语言,几乎都需要经过以下过程:
良师--学习Python课程+入门书籍+浏览技术博客
社区帮助--善于使用搜索引擎、Mail List
益友 -- 寻找学习伙伴
Learn by Code --项目实践
一、Python学习课程推荐
这两个学习课程从最基础的Python语法开始,介绍了Python数据分析、统计模型以及机器学习的各个方面,内容十分充足。之所以建议使用老外的课程是因为,老外上课假定你什么都不会,讲解深入浅出,尤其是对于华盛顿大学的机器学习课程,把复杂的概念讲解得十分简单。
1. 密歇根大学的《学习使用Python编程并分析数据》主要包括以下课程(讲解十分详细,深入浅出,非常适合入门学习,视频都是有字幕的):
《大家的编程 (Python 入门》:课程涵盖了如何使用Python的基本指令编写程序. 课程对学生没有先设要求, 我们只涉及到最基本的数学, 有一定使用电脑经验的人都可以完全掌握这门课的内容.
《Python 数据结构》:本课程将介绍Python编程语言的核心数据结构。我们将学习编程语言的基础概念,探索如何使用Python的内置数据结构,如列表、字典、元组,进行更为复杂的数据分析。
《使用 Python 访问网络数据》:使用Python爬取和解析网络数据
《Python 数据库开发》:使用Python和数据库进行交互
《使用 Python 获取并处理数据,并用可视化方式展现数据》
2. 华盛顿大学的《机器学习》专项课程
在专项课程页面无法选择旁听,必须点击进入单独课程页面才可,这个课程专题旁听是有限制的,无法提交作业;如有需求,可以申请奖学金,回答三个问题即可,系统自动通过申请。
《机器学习基础:案例研究》:你是否好奇数据可以告诉你什么?你是否想在关于机器学习促进商业的核心方式上有深层次的理解?你是否想能同专家们讨论关于回归,分类,深度学习以及推荐系统的一切?在这门课上,你将会通过一系列实际案例学习来获取实践经历。
《机器学习:回归》
《机器学习:分类》
《机器学习:聚类和检索》
《机器学习:推荐系统和降维》
《机器学习:应用深度学习创建智能运用》
二、网上打码教程
Learn by doing!!! 学习编程最有效的方式就是敲代码!
Codecademy围绕Python 的基础语法,内容非常丰富。
DatacampPython基本语法(他家的R语言课程十分不错!)
三、Python技术博客
简单介绍一些非常棒的Python技术学习的博客
1.廖雪峰Python教程简单易上手的Python基础语法教程,值得学习, Python 2和Python 3版本都有。
2.非常棒的pandas练习Github Repo
3.很详细的Python 爬虫教程
4.国外Data Science博客大全
四、Python入门书籍推荐
常用书籍下载网址,几乎囊括了网上能找得到的所有Python相关的书籍(PDF、Epub和mo bi格式),且提供云盘下载链接。你值得拥有!
python | 搜索结果
1. 掌握Python语法的基础上学习《Python for data analysis》是比较不错的选择,涵盖了ipython notebook、Numpy、Scipy和Pandas包的使用。
2.《Python数据分析与挖掘实战》介绍了使用Python进行数据挖掘的详细案例,数据和代码都可以下载,作为机器学习的进阶学习是不错的选择(这本书也用对应的R语言和Matlab 版本)。
3.《Python Cookbook》很厚的一本书,可以作为Python语法查询手册。
再添加几个外文书籍下载网址:
1.All IT eBooks全
2.Library Genesis各种书籍,不局限于编程书籍
3.Fox eBook - eBooks Free Download Site
4.Development / Programming / AvaxHome
五、推荐订阅博客(更细频率较高)
iPhone上可以使用Reeder阅读器,Instapaper用来保存后稍后阅读,因为信息量比较大。
No free HunchKaggle竞赛平台的官方博客,包括一些优秀的代码解读以及高分选手的采访,十分有用的经验(来自不同背景,不同年龄层次,不同职业的选手)
Flowing Data十分有用的数据分析的案例
Python日报内容十分精彩的集锦(中文)
六、FAQ (待续)
Python 2.x还是Python 3.x?
如何安装Python包? 强烈推荐Anaconda包,你值得拥有!尤其是Windows系统。
是否需要很强的统计和数学背景? 有良好的数学和统计背景固然很好,但是现在很多岗位对数学和统计背景要求并不很多,都是简单的算法,Python编程已经能够很方便地实现,更多的是对业务的深入理解。如有需要建议,边学习Python边学习数学统计。
七、实践项目
Kaggle竞赛项目,里面不仅仅有很多竞赛项目,而且有很多可供学习的代码、博客以及论坛,都是实战项目,有很强的实践价值。
‘玖’ python怎样向手持设备推送消息
关注leancloud已经有一段时间了,其宣布的众多开发语言支持,以及SMS, 对象存储,
用户管理及鉴权,推送,聊天等服务对于开发目前主流的移动应用来说,吸引力很大。我们开发的不同移动应用,需要去维护不同的管理后台和服务,开发起来重复
而繁琐,如果leancloud能够帮助我们减轻这些工作,那真是物超所值。
为了将应用迁移到leancloud的方案大概如下:
使用leancloud作为后端存储,用户管理和鉴权引擎;
使用python开发一个管理界面, 来帮助管理员编辑文章,发布信息;
使用js, oc作为前端语言来开发用户界面;
在第二步的时候, 我们希望先试验下如下两个简单的user cases:
创建若干个对象,存储在leancloud中;
注册一个用户,确定注册结果,并能验证提供的手机和邮箱;
就
是这么两个最简单的用例,一整个晚上下来,居然没有搞定。 首先,除了官方文档,leancloud基本很难看到任何其它形式的文档,比如FAQ,
论坛,社区,stackoverflow, 反正google不出来,其次,就是这仅有的官方文档,也是坑爹啊,
以下是我从官方文档上的代码片段,几乎未做修改。
Default
# -*- coding: utf-8 -*-#coding=utf-8import leancloudAPP_ID=''APP_KEY=''MASTER_KEY=''leancloud.init(APP_ID, "%s/%s" % (APP_KEY, MASTER_KEY))user = leancloud.User()user.set("username", "admin")user.set("password", "admin")user.set("email", "[email protected]")# other fields can be set just like with leancloud.Objectuser.set("phone", "415-392-0202")try:user.sign_up()except Exception, e:print e# Hooray! Let them use the app now.
‘拾’ python 为什么有深拷贝浅拷贝
在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题。所以,在这里按个人的理解谈谈它们之间的区别。
一、赋值(assignment)
在《Python FAQ1》一文中,对赋值已经讲的很清楚了,关键要理解变量与对象的关系。
12345
>>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')
在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。
如上例,通过使用内置函数 id() ,可以看出 a 和 b 指向内存中同一个对象。a is b会返回 True 。
二、浅拷贝(shallow )
注意:浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作、工厂函数、对象的()方法、模块中的函数。
12345678910
>>> a = [1, 2, 3]>>> b = list(a)>>> print(id(a), id(b)) # a和b身份不同140601785066200 140601784764968>>> for x, y in zip(a, b): # 但它们包含的子对象身份相同... print(id(x), id(y))... 140601911441984 140601911442048
从上面可以明显的看出来,a 浅拷贝得到 b,a 和 b 指向内存中不同的 list 对象,但它们的元素却指向相同的 int 对象。这就是浅拷贝!
三、深拷贝(deep )
所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。
深拷贝只有一种方式:模块中的deep函数。
1234567891011
>>> import >>> a = [1, 2, 3]>>> b = .deep(a)>>> print(id(a), id(b))140601785065840 140601785066200>>> for x, y in zip(a, b):... print(id(x), id(y))... 140601911441984 140601911442048
看了上面的例子,有人可能会疑惑:
为什么使用了深拷贝,a和b中元素的id还是一样呢?
答:这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 b 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个。
我们可以用一个包含可变对象的列表来确切地展示“浅拷贝”与“深拷贝”的区别:
>>> import >>> a = [[1, 2],[5, 6], [8, 9]]>>> b = .(a) # 浅拷贝得到b>>> c = .deep(a) # 深拷贝得到c>>> print(id(a), id(b)) # a 和 b 不同139832578518984 139832578335520>>> for x, y in zip(a, b): # a 和 b 的子对象相同... print(id(x), id(y))... 139832578622816 139832578623104>>> print(id(a), id(c)) # a 和 c 不同139832578518984 139832578622456>>> for x, y in zip(a, c): # a 和 c 的子对象也不同... print(id(x), id(y))... 139832578622816 139832578623392
从这个例子中可以清晰地看出浅拷贝与深拷贝地区别。
总结:
1、赋值:简单地拷贝对象的引用,两个对象的id相同。
2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。
3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。
浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。