如何更好地阅读Python代码?
没有明确的(类型)声明,我很难理解事情是怎么运作的——你有没有一些好的经验法则或建议,能帮助我更好地阅读Python代码?谢谢!
4 个回答
了解一下鸭子类型。鸭子类型的一个目的就是你不需要过多考虑某个东西的类型。真正重要的是,这个变量能按照你想要的方式使用。
在Python中,你不需要声明类型,因为你给变量起的名字其实只是指向一个对象的指针,而且这个指向可以随时改变。
a = None
a = 1+5
a = my_function() # calls my function and assigns the return object to a
a = my_function # Assigns the function itself to a. You could actually pass it as a parameter
a = MyClass() # Runs the __init__() function of the class and assigns the return value to a
a = MyClass # Assigns the class itself to a.
这些都是有效的Python代码。你可以按顺序运行这些代码,虽然随意改变类型并不是很受欢迎,除非你能清楚地说明为什么这样做。
你可以去看看PEP8文档。这个文档讲的是Python代码的格式和风格。
尽管这个问题给人的第一印象可能不太好,但我认为它其实很聪明,因为它揭示了你潜意识里对一些事情的关注,这些事情应该引起任何Python开发者的兴趣,但我发现这些在一般情况下被忽视,尤其是在解释时,甚至有时被误解。
我的意思是,Python的基础非常独特且聪明:它的设计是基于一个数据模型。
在这个Python的数据模型中,没有像其他语言那样的“可以改变内容的内存块”这种变量,换句话说,我们在Python中并不管理这种具体的变量。
更准确地说,Python中的一切都是对象,每个对象都有一个名字和一个标识符,但对象和标识符都不是上述意义上的“变量”。
这并不意味着没有小盒子,也就是在其他语言中称为变量的东西,它们在实现的深层中暂时存放着进出值。
.
假设一个对象的标识符是 XYA2
。
我个人使用这种字母的形式来表示任何标识符。标识符就是代码中写的一个词。它就是代码中出现的内容。
注意,这种字母的形式是stackoverflow.com网站用来在文本中表示代码示例的方式,点击按钮{}就能看到。这很容易记住。
现在,名为 XYA2 的 对象 是一个 真实 的东西,是一组 位,存放在 计算机 的 内存 中,用来表示它所代表的期望的 概念值。
这组位是在C语言中定义的,而Python就是用C语言实现的。
我个人在想要表示一个对象时会把字母加粗。
所以,名为 XYA2
的对象,对我来说,就是 XYA2。
标识符是 XYA2
。
它与一个底层的、不可访问的指针相连,这个指针指向对象。
这种连接是通过 符号表 实现的。你在stackoverflow或其他地方很少看到对 符号表 的引用或提及。但我认为它非常重要。
与标识符 XYA2
相关的指针指向对象 XYA2。
所以,XYA2
直接与指针相连,间接与对象相连。
我们通常说“分配”而不是“间接连接”。一个对象和它的标识符是相互分配的,但这种连接的媒介是底层的指针。
.
现在,有一点很重要。
严格来说,变量是“可以改变内容的内存块”。
我个人努力不在其他意义上使用“变量”这个词。
问题在于,由于“变量”这个词在数学中的使用,很多开发者(并不是全部)常常不加区分地使用这个词,甚至在不合适的情况下也会使用。
因此,几乎每个人都习惯用这个词来指代代码中的名称,也就是标识符。但这种做法非常混乱,应该小心避免。
也就是说,Python中的对象不仅仅是某个类的实例,它更是一个具体的位集合;而这个集合在我看来,并不是“可以改变内容的内存块”意义上的变量。
因此,我认为Python中没有变量,因为我们能访问和操作的唯一实体是标识符和对象。
不过,在执行的Python程序中,底层的过程使用了大量的指针,按照我所知,这些指针在严格意义上是“真实的变量”。
所以,从某种意义上说,我的说法“Python中没有变量”是错误的。
这只是一个观点问题。
作为Python开发者,从概念上讲,我不管理变量。当我思考一个算法时,我并不考虑指针的层面,即使我知道它们存在,并且知道它们的存在非常重要。在不考虑变量的情况下,我在Python的数据模型层面上思考,所以我不明白为什么我应该相信Python程序中有变量。变量存在于机器的低层,而Python是一种高级语言。
.
我为什么要写这些呢?
1)
因为Python的数据模型的性质有很多后果,如果不了解这个数据模型,就无法理解这些后果。其中一些后果很有趣,因为它们提供了惊人的可能性,而另一些则是陷阱(一个众所周知的例子是:修改一个复制列表中的元素也会修改原始列表中的元素)。这就是为什么了解这个数据模型至关重要。
为此,我建议你阅读文档的以下部分:
3.1节的 对象、值和类型
4.1节的 命名和绑定
.
2)
为了回应你对这个问题的困惑:不要纠结于底层发生了什么:
有垃圾回收器、引用计数、底层字典类的实体、在底层指针的秘密中进行的值的华丽舞蹈、解释器进行的许多验证……当某些东西不合适时,会以异常消息的形式发出警告。
Python掌控一切
你唯一需要关注的就是思考你想实现的算法,为此,了解数据模型是至关重要的。
欢迎来到Python的世界
警告
我不认为自己是一个非常熟练的Python开发者,我只是一个在理解Python的一些基本概念之前遇到很多问题的业余爱好者。
以上所有描述都是我对Python数据模型的个人看法。如果这段描述中的任何一点不正确,我很乐意在有充分论证的情况下学习更多。
但我强调,这种看法让我能够理解并解决许多棘手的问题,并实现Python所能做到的一些复杂机制。所以,以上描述并不全是错误的。