如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲。
本文比较并解释了这种赋值逻辑上的差异。回答了为什么需要这种赋值逻辑以及如何使用这种赋值逻辑的问题。
当然,即使未学过 C 语言,也可通过本文更好地了解 Python 的赋值逻辑——这种赋值逻辑影响着 Python 的方方面面,从而可以让你更好地理解和编写 Python 程序。
第一章 引例
第二章 Python 的“反直觉”
而数据在 Python 中被称为 对象 (Object) 。
这句话并不太严谨。不过在这个简单的例子中是成立的。
一个整数 3 是一个 int 型对象,一个 'hello'是一个字符串对象,一个 [1, 2, 3]是一个列表对象。
Python 把一切数据都看成「对象」。它为每一个对象分配一个内存空间。 一个对象被创建后,它的 id 就不再发生变化。
id 是 identity 的缩写。意为“身份;标识”。
在 Python 中,可以使用 id(),来获得一个对象的 id,可以看作是该对象在内存中的地址。
章补充:
Python 的赋值更改的是变量的指向关系,因此,对于 Python,从前向后阅读一个赋值表达式会更加容易理解。
第三章 回答第一章的问题
Python 中 b首先指向了对象 3,然而因为对象之间的独立性,一个对象不能去覆盖另一个对象,则令b指向对象5,而不是将对象3在内存中替换为
对象5。
这种对象的值可以修改的对象被称为 可变对象 (immutable object) 。常见的列表、字典为可变对象。
因为它的值可以被修改,因此如果有多个变量指向该列表:
但在函数以外的区域,我们要尽量避免这样使用,这很容易导致出错(当然,有时候会很有用,这取决于你的程序)。比如,在多人协作编程时,如果甲不小心修改了某可变对象,那么乙、丙、丁等用到该对象的人都会受到影响。
而对于不可变对象 (immutable object),即其值无法更改的对象,传入函数时则不会影响“实参”的值:
不要混淆这两种赋值逻辑,它们有着完全不同的物理实现方式。
不同的思维逻辑会导致不同的编写逻辑。尽管这两种逻辑在很多情况下的结果是一致的,但并不能就简单地认为它们是一致的。否则在一些小的细节方面出了错误,就会难以理解。只能死记硬背,把一些东西当作 Python 的特例来记,虽然「唯手熟尔」也可以让你走得很远,但思维正确时,不仅可以走得更远,也会走得更加轻松。
比如,当你的思维清晰时,以下问题的答案自然也就水落石出了:
你照葫芦画瓢是没什么多大的作用的。我不会直接告诉你答案也不是我不想告诉你,而是希望你能跟着思路,自己找到答案,这才是真的学会了,掌握了这其中的知识点,下次在遇到就会了,而不是到处去问。如果你还在迷茫,不知道该往哪个方向走,如果你还找不到Python的入门,如果你还在为碰到各种知识点不会而苦恼,那就加小编自己弄的一个交流学习基地吧。大家可以加入交流基地:58937142,里面新手入门资料,可以说从零到项目实战,都是可以免费获取的,还有热心肠的答疑小伙伴为各位免费解答问题,热心肠的小伙伴也是蛮多的。不失为是一个交流的的好地方,小编在这里邀请大家加入我的大家庭。欢迎你的到来。一起交流学习!共同进步!小编等你!