写了这么多年的python,tuple竟然是可变的?

第一时间关注程序猿(媛)身边的故事

图片源自:Home Alone

作者

猿媛牧场

如需转载,请联系原作者授权。

1

根据Python对数据类型的定义:"objects are Python's abstraction for data, and all data in a Python program is represented by objects or by relations between objects"。

Python中一切皆对象,包括整数浮点数布尔值。在Java中,这些是“primitive数据类型”,并被视为与“objects”分开。

在Python中并非如此。Python中的每个值都是一个对象,所以不仅datetime对象是一个对象,而且整数是一个对象,布尔是一个对象。

所有的Python对象都有三件事:一个,一个类型和一个身份。这有点令人困惑,因为我们经常随便说,例如“值”。

该变量指的是具有值69,类型和id为。id是一个唯一的整数,在创建对象时创建,并且永远不会改变对象的生命周期。对象的类型也不能改变。只有对象的值可能会改变。

让我们尝试通过在交互式shell中输入以下内容来更改对象的值:

可能有的同学就会认为已经将对象的值从改变为666,然而并没有。我们所做的都是将指向1个新的对象。

整数(浮点数,布尔值,字符串,字节)是不可变的。另外,列表(字典,集合,数组和字节数组)是可变的。这可能会导致一个常见的Python陷阱:

究其原因就是papapa和spam同时指向了同一个对象。来看这行。创建了引用的副本,而不是对象。

2

关于Python is 和 == 的区别,以后我会单独拿出来说一下的。这里我们先来看几个例子:

2个不同的变量,他们可以共享同一个,但是永远无法共享同一个对象

3

好了,现在有了上面这些做铺垫,我们终于可以展开tuple到底是mutable or immutable了。从某种意义上说,元组是不可变的,因为元组中的对象不能被删除或被新对象所替代。就像不改变spam=69中的对象一样;它用一个全新的对象代替它,666。

相同的对象将始终存在于这个元组中,并且它们将始终具有相同顺序的相同身份:4325825872和4327743416. 因为元组是不可变的

然而在另一种意义上,元组是可变的,因为它们的值可以被改变。

在这个例子中,元组称为通过和具有相等的值(根据),但是是不同的对象(根据)。

接着我们改变了spam的值,因为不再等于,而我们也没有改变的值。所以元组又是可变的

- The End -

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180609A0FICY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券