Python列表的可变性讨论



在Python中,一切皆对象,对于对象中的数字,字符串,元组,其是不可变的对象。而对于列表是可变的对象。可变与不可变性,是对内存地址而言的。由于Python是解释性语言,因而对于每个对象的赋值都是对内存块的引用,例如 a=2,此时a是2的引用,若这是你修改a=2的表达式,改为a=3,此时a就指向了3这个内存块。

具体程序如下所示:

a = 2
print id(a)
a = 3
print id(a)

输出结果:

31095184
31095160

以上说明,a赋值不同的变量,只是引用不同的内存,不能对内存进行修改。这体现了不可变性。
对于元组而言,也是属于不可变性,一个元组保存在同一块内存中,属于不可变。
具体代码如下所示:

print('Research on the variability of tuple ')  
tuple1 = ("juan", 24, "110")  
print tuple1  
  
tuple1[1] = 25  
print tuple1  

输出结果:

TypeError: 'tuple' object does not support item assignment

以上说明不能对tuple1中的某个元素进行修改。
对于列表而言,其属于是可变性。具体理解可以根据C语言中的链表类比,对于列表,首地址是不可变的,而对于列表内的所有元素进行修改,会改变单个元素的地址(指向不同的引用)。所以说对于列表中的单个元素而言是不可变的,对于整体列表而言是可变的,如下图所示:

列表操作代码如下所示:

print('Research on the variability of lists')   
list1 = ["juan", 24, "110"]  
print list1  
print "ID-list1=", id(list1)  
print "ID-list1[0]=", id(list1[0])  
print "ID-list1[1]=", id(list1[1])  
  
  
list1[0] = "tao"  
list1[1] = 26  
print list1  
print "ID-list1=", id(list1)  
print "ID-list1[0]=", id(list1[0])  
print "ID-list1[1]=", id(list1[1]) 

输出结果:

Research on the variability of lists  
['juan', 24, '110']  
ID-list1= 38301128  
ID-list1[0]= 38951672  
ID-list1[1]= 31094656  
['tao', 26, '110']  
ID-list1= 38301128  
ID-list1[0]= 38951872  
ID-list1[1]= 31094608 

以上只是对这种现象的一种假想,没能进行源码的验证,若有错误,希望给予指正。


转载请注明:HunterYuan的博客 » Python列表的可变性讨论

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦