Python中变量的本质探索

参考:Vamei博客Python进阶09 动态类型

'''
a = [1,2,3]
'''
(1)这条“赋值语句”实际上是将a指向对象“[1,2,3]”,对象“[1,2,3]”是存储在内存中的实体,而a仅仅是指向这一对象的引用(reference)。a相当于一个对象地址存储器,即C语言中的指针,指向不同的对象,指针指向变化时,原对象不发生变化。引用和对象分离,是动态类型的核心。

(2)同样,给引用赋不同的值,仅仅是将其调整不同的指向,并不改变原对象的内容。 而,变量之间的值交换,也只是将被赋值的变量的指向更改。

(3)可变数据对象(mutable bject)和不可变数据对象(immutable object)
是否可以通过引用改变对象本身。
如,对于列表和词典,可以通过引用修改存储实体,称为可变数据对象。而,数字、字符串元组仅能调用对象,不能修改,称为不可改变数据对象。

对于(2)中提到的,仅适用与不可改变对象;对于可变数据对象,因为直接修改的是存储实体,所以所有指向该实体的引用的内容都会发生变化。

以上问题,还涉及到函数的参数传递问题:如果传递的是可变数据对象,那么函数体内可以修改存储实体,对等于C语言中的地址传递;如果传递的是不可变数据对象,那么传递的是引用,函数体内不能修改实体。编程时,切切注意,如直接传递列表,可能会导致列表内容发生改变,如果要保证其不发生变化,可以考虑用元组做传递参数。

(4)总结:python中的变量实质上是指向存储实体的指针(引用reference),对变量赋值,仅仅是改变其引用方向;对于可变数据对象,通过变量引用,可分次可以局部改变存储实体中的内容。并且,不可变对象的地址是共享的,即其在内存中唯一存在;而对可变对象,每次创建均会分配新的地址。不可变对象传递时,相当于传递的是值;可变对象传递时,相当于传递的是指针。

最新文章

  1. 谈谈我的入门级实体框架Loogn.OrmLite
  2. [Linux] Linux指令汇总(持续更新中...)
  3. PHP 学习笔记---基本语法
  4. Spring3.0之后->Spring MVC过滤器-HiddenHttpMethodFilter
  5. Linux下CPU占用率高分析方法
  6. Android自动化测试介绍
  7. 判断IFeatureClass图形是否含有Z值信息,若有为IPoint赋Z值
  8. poj2373
  9. yii2源码学习笔记(十七)
  10. 【Android】自带Theme
  11. Shell中处理方法返回值问题
  12. dede织梦手机站m文件夹功能基础详解
  13. Dotnetty 的心跳
  14. c# excel如何导入到sqlserver数据库
  15. tcp的4次挥手、三次握手
  16. day2_Jmeter压测
  17. ubuntu卸载福昕阅读器
  18. Django中合并同一个model的多个QuerySet
  19. 【Java集合的详细研究3】Arrays类常用方法
  20. poj 2342 && hdu 1520 树形dp

热门文章

  1. Zookeeper客户端对比选择_4
  2. jeesite模块解析,功能实现
  3. Android WebView的使用(用来显示网页)
  4. rest-assured的默认值与Specification重用
  5. LeetCode4. 两个排序数组的中位数
  6. HDU1501 简单DP
  7. 1152 Google Recruitment (20 分)
  8. Win10安装MySQL5.7.22解压缩版的方法及手动配置讲解
  9. HTML5本地存储和本地的数据库
  10. Python I/O及FIle方法