<p><strong>了解(更深入地)Python的数据类型及其在内存管理方面的作用</p>
<p>正如社区中的一些人所知,<a href="http://cyberwebconsulting.com" rel="noreferrer">I teach Python courses</a>,最受欢迎的课程是综合介绍+中级课程以及介绍各种应用程序开发领域的“高级”课程。</p>
<p>经常有人问我一个类似的问题:“我应该上你的入门课还是高级课程?”?我已经为Python编程1-2年了,我认为简介对我来说太简单了,所以我想直接跳到高级。。。你会推荐哪门课?”</p>
<p>为了回答他们的问题,我调查他们在这方面有多强——这并不是衡量他们是否准备好接受任何高级课程的最好方法,而是了解他们对Python对象和内存模型的基本知识有多好,这是导致许多Python bug的原因,这些bug的作者不仅是初学者,而且是那些已经超越了这些的人。</p>
<p>为了做到这一点,我让他们回答这个简单的两部分测验问题:
<img src="https://imgur.com/6dxRh.png" alt="Ex1: x=42; y=x; x+=1; print x,y Ex2: x=[1,2,3];y=x;x[0]=4;print x,y"/></p>
<p>很多时候,他们都能得到输出,但是<em>为什么</em>是一个更困难和更重要的反应。。。当“为什么”得到80%的学分时,我会把结果称为答案的20%。如果他们不知道原因,不管他们有怎样的Python体验,我总是会引导人们学习综合介绍+中级课程,因为我花了一节课来讲解对象和内存管理,直到你能够用足够的信心回答输出和原因。(仅仅因为您在1-2年后了解了Python的语法,在您对Python如何在封面下工作有了更深入的了解之前,并不能让您准备好超越“初学者”的标签。)</p>
<p>要求类似答案的后续调查更为艰难,例如</p>
<p><strong>示例3</strong></p>
<pre><code>x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y
</code></pre>
<p>我建议的下一个主题是理解好引用计数,学习“interning”的含义(但不一定使用它),学习浅拷贝和深拷贝(如上面的例子3),最后是语言中各种类型和结构之间的相互关系,即列表与元组,dicts与集合,列出理解vs.生成器表达式、迭代器vs.生成器等;但是所有其他建议都是另一篇文章。希望这能帮上忙!:-)</p>
<p>另外,我同意其他人的回答,因为他们更善于反省,也更善于研究其他项目的源代码,并在这两个建议中加上一个强有力的“+1”!</p>
<p>是的。顺便说一句,这个问题问得很好。我希望我一开始就足够聪明,能够提出这样的问题,但那是很久以前的事了,现在我正努力帮助其他人完成我多年的全职Python编程!!</p>