Python 可变类型和不可变类型及引用过程解析

 更新时间:2019年09月27日 08:28:19   作者:tony86   我要评论
这篇文章主要介绍了Python 可变类型和不可变类型,以及其引用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址。访问这块内存需要用到变量名,变量名实际存储的是变量的地址在内存中的地址,但是使用print()函数得到的确实这块内存中实际的地址。这个就当成规定就好,没必要纠结。

获得变量在内存中的地址,可以使用id()函数。

常规使用

变量之间的赋值其实是把一个变量的内存地址传递给另一个变量,这样两个变量便都指向内存中的同一块空间,因此这两个变量的之是相等的

a = 1
b = a
print("a:%d  b:%d" % (a,b))
print(id(a))
print(id(b))
结果:
a:1  b:1
1711072016

此时如果有第三个变量c的值与a的相等,那么c的地址与a的地址一样。这一点请大家牢记。

a = 1
c = 1
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:1
1711072016

此时如果修改变量c的值,那么会在内存中新开辟一块内存来存储这个变量,这块新的内存地址将会赋值给c。

a = 1
c = 1
c = 2
print("a:%d  c:%d" % (a,c))
print(id(a))
print(id(c))
结果:
a:1  c:2
1711072032

基本数据类型作为函数参数

基本数据类型作为函数实参同样是这个道理。

a = 1
print(id(a))
def func(x):
  print(id(x))
  x = 2
  print(id(x))
 
func(a)
结果:
1711072016

列表、字典等高级数据类型的引用

列表字典等高级数据类型的变量名同样存储的变量的实际地址,一个列表名赋值给另一个变量,那么这两个变量便指向内存中的同一块地址。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
结果:
[1, 2, 3] [1, 2, 3]
57931896

高级数据类型在每集加载进内存的时候内存地址与上一次可能会不同。

此时如果修改list2,也会影响list1的值,但是两个变量在内存中的地址还是不变的。这一点是与基本数据类型不一样的。

list1 = [1,2,3]
list2 = list1
print(list1,list2)
print(id(list1),id(list2))
list2.append(4)
print(list1,list2)
print(id(list1),id(list2))
 
结果:
[1, 2, 3] [1, 2, 3]
43841656
[1, 2, 3, 4] [1, 2, 3, 4]
43841656

此时如果有第三个列表list3的值也是[1,2,3,4],可以推测list3的地址与list1的地址应该是一样的,但是事实并非如此。如果有第三个列表list3的值也是[1,2,3,4],相当于在内存中新开辟一块内存来存储这个值。

list1 = [1,2,3]
list2 = list1
list3 = [1,2,3]
print(list1,list2,list3)
print(id(list1),id(list2),id(list3))
结果:
[1, 2, 3] [1, 2, 3] [1, 2, 3]
16775288 16776768

可变数据类型与不可变数据类型

在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 对于Python装饰器使用的一些建议

    对于Python装饰器使用的一些建议

    这篇文章主要介绍了对于Python装饰器使用的一些建议,装饰器是Python学习进阶中的重要知识,需要的朋友可以参考下
    2015-06-06
  • 详解Python中for循环的使用方法

    详解Python中for循环的使用方法

    这篇文章主要介绍了Python中for循环的使用方法,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • 用TensorFlow实现戴明回归算法的示例

    用TensorFlow实现戴明回归算法的示例

    这篇文章主要介绍了用TensorFlow实现戴明回归算法的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python实现中值滤波去噪方式

    Python实现中值滤波去噪方式

    今天小编就为大家分享一篇Python实现中值滤波去噪方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Vue的el-scrollbar实现自定义滚动

    Vue的el-scrollbar实现自定义滚动

    本篇文章给大家分享了Vue的el-scrollbar实现自定义滚动实现的过程和实例代码,对此有需要的朋友可以参考下。
    2018-05-05
  • Python Logging 日志记录入门学习

    Python Logging 日志记录入门学习

    这篇文章主要介绍了Python Logging 日志记录入门学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • django之对FileField字段的upload_to的设定方法

    django之对FileField字段的upload_to的设定方法

    今天小编就为大家分享一篇django之对FileField字段的upload_to的设定方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • spyder常用快捷键(分享)

    spyder常用快捷键(分享)

    下面小编就为大家带来一篇spyder常用快捷键(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Python 自动化表单提交实例代码

    Python 自动化表单提交实例代码

    今天以一个表单的自动提交,来进一步学习selenium的用法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-06-06
  • python算法学习之计数排序实例

    python算法学习之计数排序实例

    本代码介绍了python算法学习中的计数排序实例,代码大家参考使用吧
    2013-12-12

最新评论