tuple不可变,本质指的是内存地址不可变吗?

tuple不可变,本质指的是位置吗?
看了廖老师教程,对于tuple不可变性解释到 指向不变即tuple不变~
但这个指向不变的本质是?
用了例子说把

>>> t=(1,2,3,['a','b','c'],4,5)

>>> t[3][0]='x'

>>> t

(1, 2, 3, ['x', 'b', 'c'], 4, 5) #tuple中嵌套的list元素可以改变

>>> t[3][1:3]='y','z' #索性改变全部list元素

>>> t

(1, 2, 3, ['x', 'y', 'z'], 4, 5)

上例可以看到list全部元素改变,但tuple依然不报错,那么可以认为tuple指向的t[3]没变。
问题来了:tuple指向的list被认为“没变”-指的是list在内存中分配的地址没变吗?
也即是说:['a','b','c']被创建后,它的内存位置就分配好了,改变其中的元素'a','b','c',不会对list本身有影响,因为“改变元素只是改变了指向,内存位置定了,指向谁都无所谓,不影响本身”
我的表达真是够笨拙。。还是画个图吧
图片描述

这样理解对吗?

回答:

你画的图的理解大致上是正确的。

tuple是不可变类型的(immutable)容器(container),这里的不可变其实本质上是指tuple没有提供方法改变自身元素。

list类型为例,定义 a = [1, 2, 3] ,再改变 某一个位置元素的值,a[0] = 10, 这个在底层是用一个方法去实现了更改位置为0元素的值,从1变更为10,因为实现了修改元素的方法,所以list是可变的类型(mutable)。

tuple类型为例,定义 b = (1, 2, 3), 如果想改变某一个元素的值,b[0] = 10, 这个时候这条语句无法找到对应的实现修改的函数,所以无法修改。

这就是 mutable和immutable类型的本质区别,就是有没有实现修改元素的方法。

回答:

"指向" 是指向一个对象, 即这个对象的identity不变. 有gc的时候没有理由期待或关心内存变或不变.

以上是 tuple不可变,本质指的是内存地址不可变吗? 的全部内容, 来源链接: utcz.com/a/163473.html

回到顶部