python创建不可变集合_python不可变集合是什么

在很多的其他语言中在传递参数的时候允许程序员选择值传递还是引用传递(比如c语言加上*号传递指针就是引用传递,而直接传递变量名就是值传递),而python只允许使用引用传递,但是它加上了可变类型和不可变类型,让我们感觉有点混乱了。听说python只允许引用传递是为方便内存管理,因为python使用的内存回收机制是计数器回收,就是每块内存上有一个计数器,表示当前有多少个对象指向该内存。每当一个变量不再使用时,就让该计数器-1,有新对象指向该内存时就让计数器+1,当计时器为0时,就可以收回这块内存了。

python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float,tuple.

python不可变对象int,string,float,tuple

先来看一个例子def int_test():

i = 77

j = 77

print(id(77))                  #140396579590760

print('i id:' + str(id(i)))      #i id:140396579590760

print('j id:' + str(id(j)))      #j id:140396579590760

print i is j                    #True

j = j + 1

print('new i id:' + str(id(i)))  #new i id:140396579590760

print('new j id:' + str(id(j)))  #new j id:140396579590736

print i is j                    #False

if __name__ == '__main__':

int_test()

有i和j俩个变量的值为77,通过打印77的ID和变量i,j在内存中的id我们得知它们都是指向同一块内存。所以说i和j都是指向同一个对象的。然后我们修改j的值,让j的值+1.按道理j修改之后应该i的值也发生改变的,因为它们都是指向的同一块内存,但结果是并没有。因为int类型是不可变类型,所有其实是j复制了一份到新的内存地址然后+1,然后j又指向了新的地址。所以j的内存id发生了变化。

内存分配情况如下:

python可变对象

dict,listdef dict_test():

a = {}

b = a

print(id(a))

a['a'] = 'hhhh'

print('id a:' + str(id(a)))

print('a:' + str(a))

print('id b:' + str(id(b)))

print('b:' + str(b))if __name__ == '__main__':

dict_test()

运行结果如下:140367329543360

id a:140367329543360

a:{'a': 'hhhh'}

id b:140367329543360

b:{'a': 'hhhh'}

可以看到a最早的内存地址id是140367329543360 然后把a赋值给b其实就是让变量b的也指向a所指向的内存空间。然后我们发现当a发生变化后,b也跟着发生变化了,因为list是可变类型,所以并不会复制一份再改变,而是直接在a所指向的内存空间修改数据,而b也是指向该内存空间的,自然b也就跟着改变了。

内存变化如下:

python函数的参数传递

由于python规定参数传递都是传递引用,也就是传递给函数的是原变量实际所指向的内存空间,修改的时候就会根据该引用的指向去修改该内存中的内容,所以按道理说我们在函数内改变了传递过来的参数的值的话,原来外部的变量也应该受到影响。但是上面我们说到了python中有可变类型和不可变类型,这样的话,当传过来的是可变类型(list,dict)时,我们在函数内部修改就会影响函数外部的变量。而传入的是不可变类型时在函数内部修改改变量并不会影响函数外部的变量,因为修改的时候会先复制一份再修改。下面通过代码证明一下:def test(a_int, b_list):

a_int = a_int + 1

b_list.append('13')

print('inner a_int:' + str(a_int))

print('inner b_list:' + str(b_list))

if __name__ == '__main__':

a_int = 5

b_list = [10, 11]

test(a_int, b_list)

print('outer a_int:' + str(a_int))

print('outer b_list:' + str(b_list))

运行结果如下:inner a_int:6

inner b_list:[10, 11, '13']

outer a_int:5

outer b_list:[10, 11, '13']

答案显而易见啦,经过test()方法修改后,传递过来的int类型外部变量没有发生改变,而list这种可变类型则因为test()方法的影响导致内容发生了改变。更多学习内容,请点击云海天教程网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端大屏模板分享-可在线浏览

1. 前言站长以前介绍过这个开源项目,最近又有人在问,索性挂在Dotnet9网站上,方便大家在线浏览,先声明,模板来自下面的仓库:仓库名:大屏数据展示模板作者:lvyeyou开源协议&#xff1a…

linux shell之awk

1 awk awk 是一款设计用于数据流的工具, awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处 awk 脚本的结构基本如下所示: awk BEGIN{print "start" } pattern { commands } END{ print "end" } file awk 脚本通常由3部分组成…

微软的最高市值是多少?

有人说微软1999 年 12 一个月股价达到历史新高 $58.38不准确。我1999年12月22可能会增加微软。公司按照1999年12月27最新价格格(119.125,股票分割后成为59.5625)他给了我一个选项。价格格,微软股价史无前例的成为了最高点&#xf…

使用Scala实现Java项目的单词计数:串行及Actor版本

其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言。 Scala 就是一个不错的选择。 Scala 有很多语言特性, 建议先掌握基础常用的: 变量、控制结构 、正则与模式匹配、集合、文件读写/目录遍…

vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle

最近在折腾oracle ebs的安装 ,用xmanager连接solairs10的过程中,总是连接3个小时左右就挂掉,很郁闷!本文参考eygle的文章1;首先从 eygle提供的网址上下载vnc软件下载得到的文件如下 vnc-3.3.4-solaris_2.5.tar.tar然…

sql CHECK ,UNIQUE 约束(mysql)

check 用来限定值的范围,如下表: CREATE TABLE test22 ( age INT(10), sex VARCHAR(10), name11 VARCHAR(10) NOT NULL, CHECK (age>0) ) 在此,check限制了age的值为0以上 如果想让age的的不唯一呢?那就使用UNIQUE了&…

html+css常用小笔记(持续更新)

1去掉input点击时的蓝色边框outline:none; 2禁止文本选中-webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Chrome/Safari/Opera */ -khtml-user-select: none; /* Konqueror */ -moz-user-select: none; /* Firefox */ -ms-user-select: none; /…

音视频基本概念和FFmpeg的简单入门

写在前面最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下;基本概念容器/文件(Conainer/File):即特定格式的多媒体文件,一般来说一个视频文件是由视频,音频&#…

linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)

1 问题 1)合并2个文件,这里用paste命令 2)找到匹配的文件里面替换内容,这里用find 和 -exec或xargs命令组合 2 实现 1)合并2个文件,这里用paste命令,我们在paste后面加参数-d 然后加" &…

Windows Live Writer 的昨日荣光

今天这一篇文章,想写一写Windows Live Writer这款博客编辑器(最早的一个版本是2007年发布的)。毫不夸张地说,这是为数不多的几款所见即所得的编辑器之一,当然,它的运行速度慢也是一个众所周知的问题。作为一…

qpython执行手机脚本精灵使用教程_Android上执行python脚本-QPython

看书,发现android可以跑python。尝试了一下。首先需要在手机上安装python环境,通过安装apk实现,这个apk叫QPython,还有同类的比如SL4A。QPython的官网:https://www.qpython.com/可以在官网上下载QPython的安装包&#…

猎豹MFC--CMenu菜单 设置主菜单 给主对话框设置菜单 设置快捷菜单

设置主菜单(不是快捷菜单):给主对话框设置菜单:效果如下:修改菜单的ID使之便于记忆:给菜单添加消息处理:添加处理代码:设置快捷菜单:打开对话框,属性添加消息…

SQL主键简单表述

主键(PRIMARY KEY 约束):PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键就是唯一的,其是索引的一种,并且是唯一性索引的一种。 其实主键就像我们的身份证一样,每一个主键的id就表示着一个特定的一…

oracle 删除空间不足,oracle表空间扩容、创建、删除(解决表空间不足问题)

前言整理一下之前使用oracle数据库遇到的表空间不足的问题,顺便水个博客。oracle表空间操作语句1.改变已存在的数据文件的大小ALTER TABLESPACE app_data ADD DATAFILE ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF‘ SIZE 20480M;2.允许已存在的数据文件…

重复数据删除:块级技术VS.字节级技术

重复数据删除技术能够识别重复的数据,消除冗余,减少需转移或存储的数据的总体容量。在本文中,我将分别对这两种技术加以评论。与块级技术相比,字节级删除技术对数据的检查更加细微,精度更高,但同时需要更加…

Mac升级到Yosemite后默认的php版本不支持imagetfftext函数问题解决

Mac升级到yosemite后,php也自动升级,运行项目的时候发现后台验证码显示不出来。调试一下发现imagetfftext这个函数不存在,应该gd没有安装完全,因为Mac上的php实现系统自带的,只能通过重新安装php来解决【不能通过安装扩…

linux shell之字符串的更具字符分割和删除字符和文本内容的删除以及内容是否匹配成功

1 字符串的更具字符分割 1) xargs分割 echo "chenyu*hello*word" | xargs -d "*" chenyu hello word 2) awk分割 echo "chenyu*hello*word" | awk -F "*" {print $1} chenyu 2 字符串的删除字符 1&#xf…

将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形?

问题: 将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形? 解答: 一次分割都是将一个分成4个,增加了3(1*3)个…

领域事件和集成事件没那么高大上

前言随着系统架构的演变,有很多名词也随之涌现,如:微服务、灰度发布、资源隔离、容器、领域/集成事件等,听着的确高大上,让很多小伙伴有一种无法征服的感觉;其实很多东西可能之前就已经用过了,只…

python截图拼接_Python实现屏幕截图有两种方式 - 小众知识

使用windows API使用PIL中的ImageGrab模块下面对两者的特点和用法进行详细解释。一、Python调用windows API实现屏幕截图好处是灵活速度快缺点是:写法繁琐不跨平台import timeimport win32gui, win32ui, win32con, win32apidef window_capture(filename):hwnd 0 #…