写了这么多年的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.datetime(2018, 6, 3, 19, 38, 54, 798338)
datetime对象是一个对象,而且整数69
是一个对象,布尔True
是一个对象。
所有的Python对象都有三件事:一个值,一个类型和一个身份。这有点令人困惑,因为我们经常随便说,例如“值69
”。
>>> spam = 69
>>> spam
69
>>> type(spam)
< class 'int'>
>>> id(spam)
4307168128
该变量spam
指的是具有值69,类型int
和id为4307168128
。id是一个唯一的整数,在创建对象时创建,并且永远不会改变对象的生命周期。对象的类型也不能改变。只有对象的值可能会改变。
让我们尝试通过在交互式shell中输入以下内容来更改对象的值:
>>> spam = 69
>>> spam = 666
可能有的同学就会认为已经将对象的值从69
改变为666,然而并没有。我们所做的都是将spam
指向1个新的对象。
>>> spam = 69
>>> id(spam)
4307168128
>>> spam = 666
>>> id(spam)
4325801680
整数(浮点数,布尔值,字符串,字节)是不可变的。另外,列表(字典,集合,数组和字节数组)是可变的。这可能会导致一个常见的Python陷阱:
>>> spam = ['miracle', 'young']
>>> papapa = spam
>>> spam
['miracle', 'young']
>>> papapa
['miracle', 'young']
>>> spam.append('girl')
>>> spam
['miracle', 'young', 'girl']
>>> papapa
['miracle', 'young', 'girl']
究其原因就是papapa和spam同时指向了同一个对象。来看papapa = spam
这行。创建了引用的副本,而不是对象。
2
>>> id(spam) == id(papapa)
True
>>> spam is papapa
True
>>> spam == papapa
True
>>> fxxk = ['miracle', 'young', 'girl']
>>> spam == fxxk
True
>>> id(fxxk)
4325976648
>>> spam is fxxk
False
>>> id(spam)
4325974216
3
spam=69;spam=666
不改变spam=69中的对象一样; 它用一个全新的对象代替它,666。>>> spam = ['miracle', 'young', ['girl', 'boy']]
>>> spam = ('miracle', 'young', ['girl', 'boy'])
>>> id(spam[0]), id(spam[1]), id(spam[2])
(4325825872, 4327743416, 4326146632)
然而在另一种意义上,元组是可变的,因为它们的值可以被改变。
>>> fxxk = ('miracle', 'young', ['girl', 'boy'])
>>> spam == fxxk
True
>>> spam is fxxk
False
>>> spam[2].append('man')
>>> spam == fxxk
False
在这个例子中,元组称为通过spam
和fxxk
具有相等的值(根据==
),但是是不同的对象(根据is
)。
接着我们改变了spam的值,因为spam
不再等于fxxk
,而我们也没有改变fxxk
的值。所以元组又是可变的。
- The End -
点击图片get往期内容
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 习近平G20里约峰会展现大国担当 7977553
- 2 一个金镯子省出1200元 金价真跌了 7916451
- 3 胖东来:员工不许靠父母买房买车 7866838
- 4 二十国集团里约峰会将会卓有成效 7789966
- 5 俄导弹击中乌水电站大坝 7627867
- 6 孙颖莎王艺迪不敌日本削球组合 7541990
- 7 高三女生酒后被强奸致死?检方回应 7472945
- 8 第一视角记录虎鲨吞下手机全程 7340745
- 9 中国一捕捉宇宙幽灵粒子装置建成 7200182
- 10 智慧乌镇点亮数字经济新未来 7187470