与c/c++不同,Python/Java中的变量都是引用类型,没有值类型

Python赋值语句由三部分构成,例如:

  int   a  = 1

类型 标识 值

标识(identity):用于唯一标识一个对象(指向对象的内存地址);类型(type);值(value)

Python使用标识访问对象的值,也就是说Python中的对象其实相当于c的指针

引用(reference):对象的内存地址

可变类型:重新赋值时直接更改内存中原有对象,变量引用不变。float、list、dict

不可变类型:重新赋值时在内存中创建一个新对象,同时改变变量的引用。int、char、tuple

这样设置是为了提高效率,比如1、2这样的变量可能经常被用到,一次定义多次引用的话效率会比较高

知道了Python变量的内存机制,就可以避免一些坑。比如而a、b的类型都是List,令a=b后,对a、b任意一个List进行修改,都会影响另外一个List的值,因为他们实际指向同一个内存地址

要注意区分“对象(object)”和“变量(variable)”,对象是在程序中创建的,储存在内存中,变量是对象的引用(reference),变量赋值是让变量指向对象,一个对象可以被多个变量指向

python中所有的数据类型都是对象

可变对象(列表、字典、集合)的改变会影响所有指向该对象的变量

不可变对象(字符串、整型、元组),所有指向该对象的变量的值总是一样的,也不会改变,通过某些操作更新其值时会返回一个新的对象【一旦创建,不可改变】

变量可以被删除,但对象不可以,只能被垃圾回收机制回收

 1 l1=[1,2,3]
2 print(id(l1))
3 l1.append(4)
4 l2=[1,2,3]
5 l3=l2
6 print(id(l1))
7 print(id(l2))
8 print(id(l3))
9
10 v1=1
11 print(id(v1))
12 v1=2
13 v2=1
14 v3=v2
15 print(id(v1))
16 print(id(v2))
17 print(id(v3))

输出:

154977800
154977800
138660424
138660424
8791557861120
8791557861152
8791557861120
8791557861120

可见,可变对象每次创建时都会创建一个新的对象,随后发生改变会影响所有指向它的变量

 1 test=[1]
2 def change1(a):
3 a = [2]
4 print(id(a))
5 def change2(a):
6 a.append(3)
7 print(id(a))
8 print(id(test))
9 change1(test)
10 change2(test)
11 print(test)

输出:

154977800
128902536
154977800
[1, 3]

第一个函数是重新赋值,第二个函数是改变原对象的值自建对象属于可变对象

 1 class Dog():
2 def __init__(self,name,age):
3 self.name = name
4 self.age = age
5
6 dog1 = Dog('Sam',2)
7 print(id(dog1))
8 dog2 = Dog('Tom',1)
9 print(id(dog2))
10 dog1.name = 'Petter'
11 print(id(dog1))

输出:

155199584
155198408
155199584

自建对象属于可变对象

参考:

https://www.cnblogs.com/blackmatrix/p/5614086.html

https://blog.csdn.net/u012995500/article/details/82764128

最新文章

  1. Extjs,Git,插件....学习网址
  2. mvc 中关于资源文件的扩展
  3. 基于时间点恢复数据库stopat
  4. Java 集合深入理解(13):Stack 栈
  5. 222. Count Complete Tree Nodes
  6. RTMP协议详解(转)
  7. 判斷作業系統為 64bit 或 32bit z
  8. $provide.decorator
  9. HALCON学习笔记
  10. Where 与 Having
  11. vue iview render里面写时间截取
  12. 编译安装centos7 php7.2 mysql5.7 nginx1.9.9
  13. Java语法 [HelloWorld]
  14. 背水一战 Windows 10 (87) - 文件系统: 获取文件的属性, 修改文件的属性, 获取文件的缩略图
  15. vue 中使用 Toast弹框
  16. 电容器的ESR
  17. 通过项目逐步深入了解Mybatis<二>
  18. MyBatis-Plus 3.0.7.1
  19. Spring的Cache注解
  20. RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ

热门文章

  1. Python异步asyncio快速实践模版
  2. js 更改json的 key
  3. 201871010203-陈鹏昱 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
  4. Qt开发技术:图形视图框架(一)基本介绍
  5. vue 快速入门 系列 —— vue 的基础应用(下)
  6. kubernetes-copyFromPod
  7. 关于搭建FTP服务器
  8. Day14_75_反射(reflect)
  9. Unknown custom element: <componentName> - did you register the component correct?
  10. 在 Windows 用上 Linux GUI——GitHub 热点速览 v.21.17