Python基础知识,自己写一写比较不容易忘

Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。

对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。

不可变类型以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的int对象,i引用自这个新的对象。

>>> i = 5

>>> i += 1

>>> i

6

通过id函数查看变量i的内存地址进行验证(使用hex(id(i)) 可以查看16进制的内存地址)

>>> i = 5

>>> i += 1

>>> i

6

>>> id(i)

140243713967984

>>> i += 1

>>> i

7

>>> id(i)

140243713967960

可以看到执行 i += 1 时,内存地址都会变化,因为int 类型是不可变的。

再改改代码,但多个int类型的变量值相同时,看看它们内存地址是否相同。

>>> i = 5

>>> j = 5

>>> id(i)

140656970352216

>>> id(j)

140656970352216

>>> k = 5

>>> id(k)

140656970352216

>>> x = 6

>>> id(x)

140656970352192

>>> y = 6

>>> id(y)

140656970352192

>>> z = 6

>>> id(z)

140656970352192

对于不可变类型int,无论创建多少个不可变类型,只要值相同,都指向同个内存地址。同样情况的还有比较短的字符串。

对于其他类型则不同,以浮点类型为例,从代码运行结果可以看出它是个不可变类型:对i的值进行修改后,指向新的内存地址。

>>> i = 1.5

>>> id(i)

140675668569024

>>> i = i + 1.7

>>> i

3.2

>>> id(i)

140675668568976

修改代码声明两个相同值的浮点型变量,查看它们的id,发现它们并不是指向同个内存地址,这点和int类型不同(这方面涉及Python内存管理机制,Python对int类型和较短的字符串进行了缓存,无论声明多少个值相同的变量,实际上都指向同个内存地址。)。

>>> i = 2.5

>>> id(i)

140564351733040

>>> j = 2.5

>>> id(j)

140564351733016

可变类型的话,以list为例。list在append之后,还是指向同个内存地址,因为list是可变类型,可以在原处修改。

>>> a = [1, 2, 3]

>>> id(a)

4385327224

>>> a.append(4)

>>> id(a)

4385327224

改改代码,当存在多个值相同的不可变类型变量时,看看它们是不是跟可变类型一样指向同个内存地址

>>> a = [1, 2, 3]

>>> id(a)

4435060856

>>> b = [1, 2, 3]

>>> id(b)

4435102392

从运行结果可以看出,虽然a、b的值相同,但是指向的内存地址不同。我们也可以通过b = a 的赋值语句,让他们指向同个内存地址:

>>> a = [1, 2, 3]

>>> id(a)

4435060856

>>> b = [1, 2, 3]

>>> id(b)

4435102392

>>> b = a

>>> id(b)

4435060856

这个时候需要注意,因为a、b指向同个内存地址,而a、b的类型都是List,可变类型,对a、b任意一个List进行修改,都会影响另外一个List的值。

>>> b.append(4)

>>> a

[1, 2, 3, 4]

>>> b

[1, 2, 3, 4]

>>> id(a)

4435060856

>>> id(b)

4435060856

代码中,b变量append(4),对a变量也是影响的。输出他们的内存地址,还是指向同个内存地址。

宝剑锋从磨砺出,梅花香自苦寒来

python中什么可变_Python中的可变类型与不可变类型相关推荐

  1. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  2. python中定义数据结构_Python中的数据结构—简介

    python中定义数据结构 You have multiples algorithms, the steps of which require fetching the smallest value ...

  3. python列表对象相同_Python中的学习列表对象,List

    List(列表) 是 Python 中使用最频繁的数据类型. 列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套). 列表是写在方括号 [ ...

  4. python中有哪些赋值_python中的赋值,什么时候是传值什么时候是传址?

    参数的传递是通过自动将对象赋值给本地变量名来实现的.在函数运行时,函数头部的参数名是一个新的.本地的变量名,这个变量名是在函数的本地作用域内存在.参数的传递本质上就是python赋值的另一个实例而已. ...

  5. python中的深拷贝_Python中的深拷贝和浅拷贝

    前言:在认识深浅拷贝的时候,先了解python中的可变类型与不可变类型. 以及 python中的传参到底是传递值还是传递引用(内存地址) python中的可变数据类型主要有 :(列表,字典) 指的是在 ...

  6. python编写ATM类_Python中编写类的各种技巧和方法

    有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling).你可以把它当作一个教程, ...

  7. python中字典使用_python中字典的使用

    python中的字典的特性: 在字典中的元素是散列存放的,没有顺序, 在进行增删改查的时候使用字典中需要的关键字(key)即可. 一: 创建字典 1)直接定义一个: dict = {'ob1':'co ...

  8. python首行缩进_python中缩进

    初识Python 初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法.下面就让我们一起来了解一下Python的编程风格. 1.逻辑行与物理行 在Python中有逻辑 ...

  9. python中的引用类型_Python中的值类型与引用类型

    其实各个标准资料中没有说明Python有值类型和引用类型的分类,这个分类一般是C++和Java中的.但是语言是相通的,所以Python肯定也有类似的.实际上Python 的变量是没有类型的,这与以往看 ...

最新文章

  1. ftp服务用户访问权限设置
  2. [云炬创业基础笔记]第二章创业者测试9
  3. 程序和计划任务管理( 查看进程ps,控制进程,终止命令进程,top命令,at一次性任务,crontab周期任务)
  4. 其实你女朋友也不是很爱你...
  5. 一个例子带你搞懂python作用域中的global、nonlocal和local
  6. 为什么要选择基于NAS存储方案
  7. 现实世界的Windows Azure:Quest Software and OnDemand Migration for Email
  8. sql-libs(6) 双引号的报错注入
  9. 微服务部署:蓝绿部署、滚动部署、灰度发布
  10. 如何将多个word文档的内容合并到一个文档 多html转word
  11. 这样找电子书,方法贴!
  12. 如何将c语言编译成动态链接库,将C语言源代码编译成动态链接库
  13. 关于php 调用接口 微信云支付 HmacSha256 加密 request_content 生成 authen_code
  14. 关于a标签 中特有的tilte属性 和 字符串文字换行
  15. uniapp 返回上一页 触发上一页的刷新
  16. 【苹果相册推】软件安装ipv6得到可由Apple使用ArrayList tmpMacList
  17. Hive实现:1、获取每个人最高分对应的学科和分数(学生最高分);2、获取每门课程都高于平均分的人、课程和分数(三好学生:每科高于平均分);3、获取每个学科都及格(即不低于60分)的学生
  18. Linux系统修复网络,Linux系统无法上网解决方案教程
  19. rosbag录制话题、播放话题多种模式
  20. 在Windows10下给PyCharm安装需要的包

热门文章

  1. C# 发送消息SendKeys、SendMessage、keybd_event的用法
  2. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据
  3. repeater 的解释说明 用法
  4. CSS的display:none与visible:hidden区别
  5. PHP文件函数 记录日志功能
  6. python字符串的美化_Python构造自定义方法来美化字典结构输出
  7. 让div margin属性消失_为什么div里面打一个字之后就会有高度了呢?
  8. linux提示光标下无字符串,vim复制、粘贴、删除、撤销、移动光标(linux)
  9. mysql ndb_mysql8 参考手册--MySQL NDB群集8.0
  10. git批量删除没用的远程分支