诠释比Lewis Carroll更深入:Python故事

我们不是只是建立实例获得自己的唯一ID吗? 那整数是对象吗? 和弦一样吗? 为什么这些具有相同的ID? 答案在于可变性。

变异性

字符串一旦声明就无法更改。 尝试一下:

字符串是不可变的 。 整数,浮点数和元组也是如此。 在Python中使用不可变类型时,解释器通过将多个变量分配给同一对象来节省空间和时间。 由于我们不能更改“ dog”,为什么当我们说a =“ dog”和b =“ dog”时将其复制两个? 只需将两个指针分配给同一只非常好的狗即可。 另一方面,列表可以更改,并且经常会非常频繁地更改。 因此,可变类型会获得单独的对象,而不变对象则不会。 您也可以使用“ ==”和“ is”操作进行验证。 检查a == b会告诉您两个对象是否具有相同的值,而a == b会告诉您两个对象是否具有完全相同的id。 看起来像这样:

好吧,让我们再次加深对此的理解:

我们不是只是说字符串是不可变的吗? 如果a和b都是不可变的字符串,如何将它们添加到c? 答案再次涉及效率。 注意那里的c的ID是如何变化的。 Python没有改变c。 它将c 重新分配到一个可以容纳我们想要的所有字符串的新位置。 此过程称为串联。 它也适用于整数。

在C语言中,我们可以讨论如何通过 (给函数提供数据的副本)或通过引用 (给函数提供实际数据,然后可以更改)将数据类型传递给函数。 那么,用Python处理什么呢? 正如您所怀疑的,答案与变异性有很大关系。 如果您传递一个函数,例如一个int,它将传递该值。 这基本上意味着该函数将创建一个新实例,无论您赋予它什么值,然后使用它。

值不变,ID不变。 您可以猜测可变列表会发生什么。

正如标题中所承诺的那样,让我们​​结束一些有关整数的有趣事实。 当然,它们是一成不变的。 如果您说a = 1,b = 1,c = 1,它们都将具有相同的ID。

所以! Python预计您将使用-5到256(含)之间的小数字。 因此,当您启动Python时,它实际上为每个数字创建对象供您使用。 它们被保存在一个链表中(可以在此处随意查看实现)。 因此,当您声明一个非常大或非常小的int时,Python实际上会去查找其内部链接列表中的第一个可用节点,并在那里为您的实例创建Python对象。 太酷了! 使用以下链接之一进一步走入兔子洞:

http://www-inst.eecs.berkeley.edu/~selfpace/cs9honline/Q2/mutation.html

Python元组:不变但可能会发生变化

http://www.openbookproject.net/thinkcs/python/english2e/ch09.html#objects-and-values