与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

[Python] 可变/不可变类型 & 参数传递的更多相关文章

  1. Python(可变/不可变类型,list,tuple,dict,set)

    补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...

  2. 005 python 整数类型/字符串类型/列表类型/可变/不可变

    可变/不可变类型 可变类型 ID不变的情况下,值改变,则称之为可变类型,如列表,字典 不可变类型 值改变,ID改变,则称之为不可变类型,如 整数 字符串,元组 整数类型 int 正整数 用途就是记录年 ...

  3. python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变

    函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...

  4. python 中的可变对象与不可变对象

    近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...

  5. python中的可变与不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...

  6. Python中的可变对象和不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...

  7. python基础之可变数据类型与不可变数据类型

    一.什么可变数据类型和不可变数据类型 可变数据类型:value值改变,id值不变:不可变数据类型:value值改变,id值也随之改变. 二.如何确定一种数据类型是可变的还是不可变的 根据可变数据类型与 ...

  8. python中不可变数据类型和可变数据类型

    在学习python过程中我们一定会遇到不可变数据类型和可变数据类型. 1.名词解释 以下所有的内容都是基于内存地址来说的. 不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址 ...

  9. Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  10. Python--基本数据类型(可变/不可变类型)

    目录 Python--基本数据类型 1.整型 int 2.浮点型 float 3.字符串 str 字符串格式 字符串嵌套 4.列表 list 列表元素的下标位置 索引和切片:字符串,列表常用 5.字典 ...

随机推荐

  1. QT项目-Chart Themes Example学习(一)

    1.main.cpp #include "themewidget.h" #include <QtWidgets/QApplication> #include <Q ...

  2. 全面了解Vue3的 ref 和相关函数和计算属性

    基础类型的响应性 -- ref 在vue3里面,我们可以通过 reactive 来实现引用类型的响应性,那么基础类型的响应性如何来实现呢? 可能你会想到这样来实现: const count = rea ...

  3. 带你全面认识CMMI V2.0(三)——实践域

    实践域以往被称为称为"过程域",如:配置管理,现在叫做"实践域".对于2.0版,则有25个适用的实践域.与以前版本的CMMI模型一样,"实践域&quo ...

  4. Spring (三)SpringAoP

    1.Spring 的 AOP 简介 1.1 什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能 ...

  5. String a=new String("abc")创建了几个对象

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...

  6. 1076 Forwards on Weibo

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  7. VScode+Sublime安装与汉化

    两大常用编辑器安装与汉化 想敲代码?工欲善其事,必先利其器,先安装编写代码所需要的工具吧.本期的主角是VScode与Sublime,这是两款比较热门的代码编辑器. 目录: VScode安装与汉化 Su ...

  8. hdu4994 博弈,按顺序拿球

    题意:       给你n堆东西,两个人博弈的去拿,每次最少一个,最多是一堆,必须按顺序那,也就是只有把第一堆的东西拿完了才能去拿第二堆东西,谁先拿完谁胜,问新手是否能胜利. 思路:       显然 ...

  9. Python中的BeautifulSoup模块

    目录 BeautifulSoup Tag NavigableString BeautifulSoup Comment 遍历文档树 直接子节点 所有子孙节点 ​ 节点内容 搜索标签 CSS选择器 Bea ...

  10. Python模块化编程

    目录 模块化 自定义模块 模块的内置属性 导入模块 安装第三方模块 查看模块的属性和方法 模块化 在Python中,一个.py文件就称之为一个模块(Module),为了避免模块名冲突,Python又引 ...