Python中的可变与不可变对象

首先要明确一点,在Python中 ,一切赋值或者函数传值的方式都是靠引用。这与C++不同,C++有传值、传引用和传指针。因为Python不能显式的定义数据类型,而且没有指针,所以默认的都是按引用传递

在Python中,数字、字符串、元组是不可变的,,列表、字典、集合是可变的。可以这么理解,Python是传引用,不可变对象的就是不能改变原来引用的值,那么操作对象的时候,是复制原来的值后,开辟新的内存空间;而可变对象就是在原来的基础上进行更改。

不可变对象

虽然是传递引用,但是由于不能改变原来引用的值,所以只能开辟新的内存空间,在复制原来值的基础上,进行改变。

a=1
b=a  # 按引用传递
print(a is b)  # 输出 True
b+=1  # 开辟新的空间,在原来的基础上+1
print(a is b)  # 输出False
print(a,b)  # 1,2s1="abc"
s2=s1  # 按引用传递
print(s1 is s2)  # 输出True
s2+="de"  # 开辟新的空间,追加'de'
print(s1 is s2)  # 输出False
print(s1,s2)  # abc,abcde

可变对象

可变对象可以直接在原来的引用上进行更改,更改的时候不会开辟新的内存空间,是在原来的内存空间上进行处理。

l1=[1,2,3]  # 定义列表
l2=l1  # 传引用
print(l1 is l2)  # 输出True
l2.append(4)  # 原来的基础上追加元素
print(l1 is l2)  # 输出True
print(l1,l2)  # [1,2,3,4,],[1,2,3,4]s1={1,2,3,4,5}  # 定义集合
s2=s1  # 传引用
print(s1 is s2)  # 输出True
s2.remove(1)  # 删除1
print(s1 is s2)  # 输出True
print(s1,s2)  # {1,2,3,4},{1,2,3,4}
# 字典同理,不在编码了

自定义对象的可变性

自定义对象都是可变的类型的。

class Test:  # 自定义测试对象def __init__(self,a=0,b=0):self._a=aself._b=bt1=Test(1,2)
t2=t1  # 传引用
print(t1 is t2)  # 输出True
t2._a=0  # 按引用更改
t2._b=0
print(t1 is t2)  # True
print("t1:",t1._a,t1._a)  # t1:0,0
print("t2:",t2._a,t2._b)  # t2:0,0

对象作为函数参数的可变性

可变对象作为函数参数,传入后还是可变对象,相当于传递的引用,函数返回可变对象,返回的是引用。不可变对象传递参数可以理解为按值传递!!

def fun1(a):a+=1def fun2(a):a+=1return adef fun3(l):l.append(2)def fun4(l):l.append(4)return la=1
b=a
fun1(a)
print(b is a)  # True
print(a)  # 1
b=fun2(a)  # 2
print(b is a)  # False
print(b)  # Nonel1=[1,2,3]
l2=l1
fun3(l1)
print(l1 is l2)  # True
print(l1)  # [1,2,3,2]
l2=fun4(l1)
print(l1 is l2)  # True
print(l2)  # [1,2,3,2,4]

当函数内部新定义了一个参数,同时返回这个参数的时候,是返回函数内部参数的引用,不论这个参数是可变还是不可变的!!!!

def test():l=[1,2,3]print(id(l))  # 140482206588104return ldef test1():a=1print(id(a))  # 10919424return al=test()
print(l)  # [1,2,3]
print(id(l))  # 140482206588104b=test1()
print(b)  # 1
print(id(b))  # 10919424

在上述代码中可以看出,函数内部的list、数字a与函数外部的list、数字a是同一个!

Python中的可变与不可变对象相关推荐

  1. python中可以作为定界符_在Python中,字符串属于不可变有序序列,使用单引号、双引号、三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套。...

    在Python中,字符串属于不可变有序序列,使用单引号.双引号.三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套. 下述哪种光谱法是基于发射原理()?A:分光光度法B:荧光光度法C:红外 ...

  2. 如何在python中找到两个日期时间对象之间的时差?

    本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...

  3. python中的is判断引用的对象是否一致,==判断值是否相等

    python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...

  4. Python中函数的参数传递与可变长参数

    1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 f ...

  5. 小白IT:从0~明白带你体验python中做上帝感觉--一切皆对象,处处是多态——面向对象

    文章目录 Python 面向对象从0到基础 一.面向对象 1 面向过程VS面向对象** 2 了解一些名词: 3 类 类的声明 **类的作用:属性引用和实例化** **定义函数和类的区别** 类属性的查 ...

  6. python中一切内容都可以称为对象吗_python对象类型及其运算2

    python一切皆对象,所有内容都是由对象展开的,对象是由类实例化而来. python中存储的所有数据都是对象. 每个对象都有一个身份.一个类型和一个值. 身份:eg:school="bei ...

  7. python中get和set使用_Python对象属性的set和get方法

    属性的set和get方法 如果有一个对象,当需要对其进行修改属性时,有2种方法: 1.对象名.属性名 = 数据 -->直接修改 2.对象名.方法名() -->间接修改 为了更好的保存属性安 ...

  8. python中的面向对象:类与对象(重点!!!)

    Python中重点与难点,必须熟练掌握!!! 一.面向对象 1.面向对象概念 面向对象(Object Oriented,OO)是软件开发方法,是一种思想.面向对象的对象是指客观世界存在的事物. 我们之 ...

  9. python读取多行json_如何在Python中读取包含多个JSON对象的JSON文件?

    所以这是在python中读取JSON文件的标准方法 import json from pprint import pprint with open('ig001.json') as data_file ...

  10. python中的类数据成员和对象数据成员

    相比于C++语言,每个类可以有类成员变量,也可以有对象的成员变量,类成员变量需要用static修饰:在python中,也有两种变量 python中类成员变量是不用self修饰的,也就是说对象成员变量需 ...

最新文章

  1. Python学习 day01打卡
  2. 自适应激活函数 ACON:统一ReLU和Swish的新范式
  3. bzoj3171: [Tjoi2013]循环格(费用流)
  4. QGIS简介与源代码编译
  5. C++函数中那些不可以被声明为虚函数的函数
  6. 对两个字符串进行比较,取出两个字符串中一样部分的长度
  7. 异常处理—错误抛出机制
  8. 断开的管道 java.io.IOException: Broken pipe 解决方法
  9. Python_多元回归(一元回归)
  10. 华为eNSP最稳定的装法
  11. 【金融】【python】使用python处理多种期货数据指标
  12. comsol软件_COMSOL软件 5.4 版本新增“薛定谔-泊松方程“多物理场接口
  13. 惊!我竟然破解了Ta的交换机/路由器的登录密码
  14. 微信小程序开发之微信小程序交互
  15. mysql 视图 过程 函数_MySql视图、存储过程、函数、索引
  16. workers.properties配置详解
  17. 和利时scada系统服务器参数,设备数据采集之SCADA系统
  18. Kubernetes(K8s) kubectl cordon, drain, uncordon 常用命令
  19. com.alibaba.fastjson.JSONException: can not cast to long, value : 1.5
  20. 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。

热门文章

  1. 【文献阅读】ResNet-Deep Residual Learning for Image Recognition--CVPR--2016
  2. R语言快速读取数据方法
  3. hihocoder1033交错和
  4. Anconda之常用命令汇总
  5. 数据结构与算法之霍夫曼编码解码实现
  6. 常用类 (一) ----- Arrays数组工具类
  7. 没有对应的Id ,报空指针异常
  8. KETTLE初学者使用教程
  9. 安装k8s,高可用3 master安装脚本
  10. [hihocoder][Offer收割]编程练习赛46