Python中的可变与不可变对象
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中的可变与不可变对象相关推荐
- python中可以作为定界符_在Python中,字符串属于不可变有序序列,使用单引号、双引号、三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套。...
在Python中,字符串属于不可变有序序列,使用单引号.双引号.三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套. 下述哪种光谱法是基于发射原理()?A:分光光度法B:荧光光度法C:红外 ...
- 如何在python中找到两个日期时间对象之间的时差?
本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...
- python中的is判断引用的对象是否一致,==判断值是否相等
python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...
- Python中函数的参数传递与可变长参数
1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0): 2 print text,num 3 4 foo("asd") #asd 0 5 f ...
- 小白IT:从0~明白带你体验python中做上帝感觉--一切皆对象,处处是多态——面向对象
文章目录 Python 面向对象从0到基础 一.面向对象 1 面向过程VS面向对象** 2 了解一些名词: 3 类 类的声明 **类的作用:属性引用和实例化** **定义函数和类的区别** 类属性的查 ...
- python中一切内容都可以称为对象吗_python对象类型及其运算2
python一切皆对象,所有内容都是由对象展开的,对象是由类实例化而来. python中存储的所有数据都是对象. 每个对象都有一个身份.一个类型和一个值. 身份:eg:school="bei ...
- python中get和set使用_Python对象属性的set和get方法
属性的set和get方法 如果有一个对象,当需要对其进行修改属性时,有2种方法: 1.对象名.属性名 = 数据 -->直接修改 2.对象名.方法名() -->间接修改 为了更好的保存属性安 ...
- python中的面向对象:类与对象(重点!!!)
Python中重点与难点,必须熟练掌握!!! 一.面向对象 1.面向对象概念 面向对象(Object Oriented,OO)是软件开发方法,是一种思想.面向对象的对象是指客观世界存在的事物. 我们之 ...
- python读取多行json_如何在Python中读取包含多个JSON对象的JSON文件?
所以这是在python中读取JSON文件的标准方法 import json from pprint import pprint with open('ig001.json') as data_file ...
- python中的类数据成员和对象数据成员
相比于C++语言,每个类可以有类成员变量,也可以有对象的成员变量,类成员变量需要用static修饰:在python中,也有两种变量 python中类成员变量是不用self修饰的,也就是说对象成员变量需 ...
最新文章
- Python学习 day01打卡
- 自适应激活函数 ACON:统一ReLU和Swish的新范式
- bzoj3171: [Tjoi2013]循环格(费用流)
- QGIS简介与源代码编译
- C++函数中那些不可以被声明为虚函数的函数
- 对两个字符串进行比较,取出两个字符串中一样部分的长度
- 异常处理—错误抛出机制
- 断开的管道 java.io.IOException: Broken pipe 解决方法
- Python_多元回归(一元回归)
- 华为eNSP最稳定的装法
- 【金融】【python】使用python处理多种期货数据指标
- comsol软件_COMSOL软件 5.4 版本新增“薛定谔-泊松方程“多物理场接口
- 惊!我竟然破解了Ta的交换机/路由器的登录密码
- 微信小程序开发之微信小程序交互
- mysql 视图 过程 函数_MySql视图、存储过程、函数、索引
- workers.properties配置详解
- 和利时scada系统服务器参数,设备数据采集之SCADA系统
- Kubernetes(K8s) kubectl cordon, drain, uncordon 常用命令
- com.alibaba.fastjson.JSONException: can not cast to long, value : 1.5
- 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。