python中的不可变对象,python自定义类是可变对象吗
在Python中一切都可以被看作一个对象。每个对象都有自己的id、类型和值。
Id:当一个对象被创建时,它的Id不会改变。这里的id实际上是对象在内存中的地址。可以使用id()来检查对象在内存中的地址。类型:与id相同。对象创建后,其类型不能更改。类型确定对象可以支持的操作。value:对象的值可以更改也可以不更改。一个对象能不能变,取决于value值能不能变。
相关学习推荐:python视频教程
不可变对象
通用不可变对象):
另一类number : int,float,complexstring upfrozenset 3360 set。我们通过例子来感受一下。
例子
x=1
y=x
id(x)==id(y)
真实的
id(1)==id(y)
True在这里创建两个int对象,并让X和Y指向同一个对象。然后我们试图修改X,使x 1
X=x 1此时x的id值是否与y的id和1的id相同?
x=x 1
id(x)==id(y)
错误的
id(x)==id(1)
错误的
id(1)==id(y)
真的不丑从结果来看,x指向的对象变了,而1没有变。这是一个不可变的对象。对于不可变对象,一旦创建,就不允许更改。
注意,不变性并不严格等同于绝对不变性。
a=([1],2,3)
id(a)
4338862696
id(a[0])
4338949128
a[0][0]=0
id(a)
4338862696
id(a[0])
338949128从上面的例子不难看出,我们改变了a[0]的值,但是并没有影响它的id值。如果不可变容器对象包含对可变对象的引用,当可变对象的值发生变化时,前者的值也会发生变化;但是容器仍然是不可变的对象,因为它的id值不会改变。
可变对象
通用可变对象):
Listdictset也是通过例子感受到的。
例子
c=[1,2,3]
b=c
id(b)==id(c)
True创建两个list对象,让C和D指向同一个对象,然后我们尝试修改C。
此时C[0]=4,我们来看看两个对象的id值是否一致。
id(c)==id(b)
True被修改后,C和D仍然指向同一个对象,由此不难得出结论,修改一个可变对象的值不会对其id产生任何影响。
函数参数
对于可变对象和不可变对象,当函数作为参数传递时,它们的行为是不同的。
例子
eg0
定义更新列表(nums列表):
print(f 2 id : { id(nums _ list)} )
nums_list=[10]
print(f 3 id : { id(nums _ list)} )
数字列表=[5,6]
print(f1:{number_list},id:{id(number_list)} )
更新列表(数字列表)
Print (F 4: {number _ list},ID : {ID (number _ list)} )看看结果
1:[5,6],id:4457707912
2 id:4457707912
3 id:4457707912
4:[5,6,10],id:4457707912
再看一个例子。
eg1
定义添加编号:
打印(f2:{id(number)} )
数字=1
打印(f3:{id(number)} )
数量=1
print(f 1: {数字},id:{id(数字)} )
添加数量(数量)
Print (f 4: {num},ID : {ID (num)} )。看看结果
1:1,id:4343768416
2 id:4343768416
3 id:4343768448
433361,id:4343768416
在其他文章中,上面的eg0称为引用传递,eg1称为值传递。但是,在官方文件中,并没有关于这两个名词的任何内容,或者说这种方式不是上述两者之一。
这里的重点是:对于可变对象,函数中值的变化会引起对象的变化;对于不可变对象,函数中值的改变不会对它们产生任何影响。以上是详细分析的Python可变对象和不可变对象的详细内容。请多关注热门IT软件开发工作室的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。