python 深入变量和引用对象
变量和对象
在《learning python》中的一个观点:变量无类型,对象有类型
在python中,如果要使用一个变量,不需要提前声明,只需要在用的时候,给这个变量赋值即可。这里特别强调,只要用一个变量,就要给这个变量赋值。
所以,像这样是不行的。
>>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined
反复提醒:一定要注意看报错信息。如果光光地写一个变量,而没有赋值,那么python认为这个变量没有定义。赋值,不仅仅是给一个非空的值,也可以给一个空值,如下,都是允许的
>>> x = 3 >>> lst = [] >>> word = "" >>> my_dict = {}
看到上面的图了吧,从图中就比较鲜明的表示了变量和对象的关系。所以,严格地将,只有放在内存空间中的对象(也就是数据)才有类型,而变量是没有类型的。
同一个变量可以同时指向两个对象吗?
>>> x = 4 >>> x = 5 >>> x 5
变量x先指向了对象4,然后指向对象5,自动跟第一个对象4解除关系。再看x,引用的对象就是5了。那么4呢?一旦没有变量引用它了,便成了垃圾,python有一个自动的收回机制。
例如:
>>> a = 100 #完成了变量a对内存空间中的对象100的引用
然后,又操作了:
>>> a = "hello"
如下图所示:
原来内存中的那个100就做为垃圾被收集了。而且,这个收集过程是python自动完成的,不用我们操心。
那么,python是怎么进行垃圾收集的呢?在Quora上也有人问这个问题,我看那个回答很精彩,做个链接:Python (programming language): How does garbage collection in Python work?
is和==的效果
以上过程的原理搞清楚了,下面就可以深入一步了。
>>> l1 = [1,2,3] >>> l2 = l1
这个操作中,l1和l2两个变量,引用的是一个对象,都是[1,2,3]。何以见得?如果通过l1来修改[1,2,3],l2引用对象也修改了,那么就证实这个观点了。
>>> l1[0] = 99 #把对象变为[99,2,3] >>> l1 #变了 [99, 2, 3] >>> l2 #真的变了吔 [99, 2, 3]
再换一个方式:
>>> l1 = [1,2,3] >>> l2 = [1,2,3] >>> l1[0] = 99 >>> l1 [99, 2, 3] >>> l2 [1, 2, 3]
l1和l2貌似指向了同样的一个对象[1,2,3],其实,在内存中,这是两块东西,互不相关。只是在内容上一样。所以,当通过l1修改引用对象的后,l2没有变化。
进一步还能这么检验:
>>> l1 [1, 2, 3] >>> l2 [1, 2, 3] >>> l1 == l2 #两个相等,是指内容一样 True >>> l1 is l2 #is 是比较两个引用对象在内存中的地址是不是一样 False #前面的检验已经说明,这是两个东东 >>> l3 = l1 #顺便看看如果这样,l3和l1应用同一个对象 >>> l3 [1, 2, 3] >>> l3 == l1 True >>> l3 is l1 #is的结果是True True
某些对象,有copy函数,通过这个函数得到的对象,是一个新的还是引用到同一个对象呢?
实验:
>>> l1 [1, 2, 3] >>> l2 = l1[:] >>> l2 [1, 2, 3] >>> l1[0] = 22 >>> l1 [22, 2, 3] >>> l2 [1, 2, 3] >>> adict = {"name":"hiekay","web":"hiekay.github.io"} >>> bdict = adict.copy() >>> bdict {'web': 'hiekay.github.io', 'name': 'hiekay'} >>> adict["email"] = "hiekay@gmail.com" >>> adict {'web': 'hiekay.github.io', 'name': 'hiekay', 'email': 'hiekay@gmail.com'} >>> bdict {'web': 'hiekay.github.io', 'name': 'hiekay'}
不过,python不总按照前面说的方式,比如小数字的时候
>>> x = 2 >>> y = 2 >>> x is y True >>> x = 200000 >>> y = 200000 >>> x is y #什么道理呀,小数字的时候,就用缓存中的. False >>> x = 'hello' >>> y = 'hello' >>> x is y True >>> x = "what is you name?" >>> y = "what is you name?" >>> x is y #不光小的数字,短的字符串也是 False
赋值是不是简单地就是等号呢?从上面得出来,=的作用就是让变量指针指向某个对象。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
1024这天,我故意写了个死循环~
导致CPU100%的原因很多,而程序中出现死循环就是原因之一。然而,并不是每个人在工作中都有机会踩中这个坑。我就是其中一个没踩过的。人生似乎有些不完整。 所以,我做了一个很重要的决定:在程序中写一个死循环。看看会发生什么事情。 当然,不是在生产环境。 我搭建了一个实验环境来做实验。只是这个实验环境不仅可以用于这个死循环实验。以下是这个环境的结构图: 还是老样子,使用Vagrant + Virtualbox + Ansible自动化搭环境。 我们会写一个简单的Spring MVC 应用,然后其中一个接口里会有死循环代码: 以下是我自己尝试找出这个死循环的过程。 一、使用top,查看是哪个进程的问题 我请求一次: http://192.168.88.10:9898/web/loop 然后,我打开新窗口,又请求一次 这里,我好奇CPU没有到200%。一直在120%和130%之间。P.S. 我一定是某个知识点不牢固,要不,不会有这个疑问。 二、堆空间 因为不涉及JVM堆空间问题,执行 jstat -gcutil 32593 1s 没看出什么问题。32593为Java进程ID,1s指1秒抽样一次...
- 下一篇
[php入门] 3、WAMP中的集成MySQL相关基础操作
前言:本文以小白视角了解WAMP集成开发环境中的MYSQL,涉及的面广而浅,算是导读性质。 1、启动运行熟悉WAMP中的MySQL 先有库、再有表、数据最终以记录的形式插入表中。其中对数据进行操作使用SQL语句,SQL是结构化的查询语言。 在wamp中已经内置了MySQL数据库,可以通过如下操作进行启动MySQL服务(每次使用数据库时,必须启动MySQL服务器) 2、控制台操作数据库简介 我们可以通过控制台来连接、操作数据库:(其中默认没有密码,直接回车即可以) 在console中常用的有show、create、drop等命令: mysql> show databases; 3、phpMyAdmin可视化操作数据库简介 控制台操作起来不太方便,这里可以用phpMyAdmin可视化MySQL数据库操作图形界面(wamp中) 4、建表及表操作的基础知识 4.1、建表: 创建一张表时要设置名称、引擎、编码和表中的字段信息。 建表时需要指定引擎,不同引擎提供不同的功能; 字段用来指明这张表里用了哪些类型的数据:int、varchar、data(日期)、text(文本,最大6553...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- 设置Eclipse缩进为4个空格,增强代码规范