python入门系列:对象引用、垃圾回收、可变性

Python中的变量是什么

引言

Python和java中的变量本质不一样,java的变量可以理解为一个盒子,用来容纳我们的对象,使用前要先声明它,好分配给我们合适的内存空间。Python的变量可以理解为一个标签,先构造出对象,再将变量贴在对象上。
Python变量没有类型,对象才有,本质上是指针。同一个变量,可以表示不同对象。
使用案例

"""
a 和 b 都贴在了同一个对象上
"""
a = [1, 2]
b = a
a.append(6)
print(a, b)
print(a is b)
print(id(a), id(b))

result:

[1, 2, 6] [1, 2, 6]

True

1840524096136 1840524096136

is和==的区别

引言

is用来判断引用是否相同
==用来判断值是否相等
使用案例

"""
对于小整数 和 较短的字符串多次出现,Python有一种缓存机制
多次出现的对象不再反复创建,后出现的对象直接引用前面的对象
"""
a, b, c, d = 1, 1, -123, -123
print(a is b)
print(c is d)

result:

True

False

a, b = [1, 2, 3], [1, 2, 3]
print(a is b)
print(a == b)

result:

False

True

del和垃圾回收

引言

del语句直接回收变量,将它所贴对象的引用计数器减一。每有一个新变量引用对象,其引用计数器就会加一
引用计数器为 0 的对象会被后续回收
使用案例

a = "hello"
b = a # a,b 两个标签都贴在了对象 "hello" 上

"hello"的引用计数器为2

del a # "hello"的引用计数器减一
print(b)
print(a)

result:

hello

NameError: name 'a' is not defined

传参问题

引言

在学习Java的时候,都讨论过传引用还是传值的问题
Python中全部都是传用
使用案例

"""
函数传参时,实际上是把实参赋值给形参
由形参来完成函数主体的运算
"""
def add(aa, bb):
aa += bb
return aa
a, b = 1, 2
c = add(a, b)
"""
函数调用之后
aa = 1, bb = 2
aa += bb => aa = aa + bb
int 是不可变类型,内存中会增加一块空间来存储(aa+bb),然后将aa标签贴在上面
a 没变,b也没变
"""
x, y = [1, 2], [3]
z = add(x, y)
"""
函数调用之后
aa = [1, 2], bb = [3]
结合鸭子类型,以及前面讲的魔法函数,可以知道,此时会调用aa.extend(bb)
list是可变类型,直接在原地修改,aa和a都指向[1, 2]
a 变了,b没变
"""
m, n = (1, 2), (3,)
p = add(m, n)
"""
和整数一样
"""
print(a, b, c)
print(x, y, z)
print(m, n, p)

result:

1 2 3

[1, 2, 3] [3] [1, 2, 3]

(1, 2) (3,) (1, 2, 3)

默认值问题

返回一个名字列表

def name_list(li=[]):

这里可能对列表做一些包装

todo

print(id(li)) # for later use

return li

创建出两个空的名字列表

x = name_list()
y = name_list()

在 x 中添加一个名字

x.append("MetaTian")
print(x, y)

result:

['MetaTian'] ['MetaTian']

我们创建出两个空的名字列表,稍后给其中一个添加了一个名字。结果,这两个名字列表是一样的,我们再来看下二者的id:

print(id(x), id(y))

result:

2499670504072 2499670504072

两者id是一样的,说明两者指向同一个对象,那这个对象又是什么呢?其实它就是函数参数列表中一个变量的默认值,就是那个空列表,可以自己在代码中打开注释,打印li的id即可验证。

Python中,一切皆对象,函数也是一个对象,那么函数是什么类型的呢?

print(type(name_list))

result:

<class 'function'>

当解释器执行到def关键字时,它会结合下面的代码生成一个函数对象,而我们提供的参数默认值,就被当做对象的一种属性封装起来了。于是,后面的两次函数调用,都是将这个对象赋值给了x, y两个变量。也就是说x, y指向了同一个对象。

注:喜欢python + qun:839383765 可以获取Python各类免费最新入门学习资料!

转载于:https://blog.51cto.com/14186420/2349825

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

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

相关文章

twitter数据分析_Twitter上最受欢迎的数据科学文章主题

twitter数据分析If you’ve written data science articles or are trying to get started, finding the most popular topics is a big help in getting your articles read. Below are the steps to easily determine what these topics are using R and the results of the …

JAVA遇见HTML——JSP篇(JSP状态管理)

案例&#xff1a;Cookie在登录中的应用 URL编码与解码的工具类解决中文乱码的问题&#xff0c;这个工具类在java.net.*包里 编码&#xff1a;URLEncoder.encode(String s,String enc)//s&#xff1a;对哪个字符串进行编码&#xff0c;enc&#xff1a;用的字符集&#xff08;例&…

PE文件讲解

我们大家都知道&#xff0c;在Windows 9x、NT、2000下&#xff0c;所有的可执行文件都是基于Microsoft设计的一种新的文件格式Portable Executable File Format&#xff08;可移植的执行体&#xff09;&#xff0c;即PE格式。有一些时候&#xff0c;我们需要对这些可执行文件进…

easyui 布局之window和panel一起使用时,拉动window宽高时panel不跟随一起变化

项目开发中布局是每一个组件都由最外层的window和内部的至少一个panel组成&#xff0c;其他的细小组件再依次放到panel中。 问题&#xff1a;当拉动外部的window时我们希望内部的panel的宽高也跟着变化&#xff0c;但是并没有&#xff0c;尤其拉动其高度是更为明显&#xff0c;…

是什么使波西米亚狂想曲成为杰作-数据科学视角

平均“命中率”是什么样的 (What an Average ‘Hit’ looks like) Before we break the song down, let us have a brief analysis of what the greatest hits of all time had in common. I have picked 1500 songs ( charting hits ) right from the ’50s to the’10s, spre…

PE文件感染和内存驻留

这次&#xff0c;作者将和大家一起讨论病毒的感染技术。另外&#xff0c;从本文开始&#xff0c;我们将陆续接触到一些病毒的高级编码技术。例如&#xff0c;内存驻留、EPO&#xff08;入口点模糊&#xff09;技术、加密技术、多态和变形等。通过这些高级技巧&#xff0c;你将进…

Python函数积累

评估函数eval() 去掉参数最外侧引号并执行余下语句的函数 fun:将让任何输入的字符串转换为python语句&#xff08;如"12132" -> 12132&#xff09;转载于:https://www.cnblogs.com/LYluck/p/10376531.html

流行编程语言_编程语言的流行度排名

流行编程语言There has never been a unanimous agreement on what the most popular programming languages are, and probably never will be. Yet we believe that there is merit in trying to come up with ways to rank the popularity of programming languages. It hel…

Attributes.Add用途与用法

Attributes.Add("javascript事件","javascript语句");如&#xff1a;this.TextBox1.Attributes.add("onblue", "window.Label1.style.backgroundColor#000000;");this.TextBox1.Attributes.Add("onblur","this.style.d…

使用UIWebView加载网页

1、使用UIWebView加载网页 运行XCode 4.3&#xff0c;新建一个Single View Application&#xff0c;命名为WebViewDemo。 2、加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 [cpp] view plaincopyprint?#import <UIKit/UIKit.h> …

Java 开源库精选(持续更新)

仅记录亲自使用和考虑使用的Apache Commons Commons IO - Commons IO 是一个帮助开发IO功能的实用程序库 Commons Configuration - Commons Configuration 提供了一个通用配置界面&#xff0c;使Java应用程序可以从各种来源读取配置数据。查看更多可重用、稳定的 Commons 组件S…

corba的兴衰_数据科学薪酬的兴衰

corba的兴衰意见 (Opinion) 目录 (Table of Contents) Introduction 介绍 Salary and Growth 薪资与增长 Summary 摘要 介绍 (Introduction) In the past five years, data science salary cumulative growth has varied between 12% in the United States, according to Glass…

hibernate的多表查询

1.交叉连接 select * from A ,B 2.内连接 可以省略inner join 隐式内连接&#xff1a; select * from A,B where A.id B.aid; 显式内连接&#xff1a; select * from A inner join B on A.id B.aid; 迫切内连接&#xff1a; 需要加上fetch关键字 内连接查询两者共有的属性…

C# 读取PE

最后分析结果会放在 一个DATASET里 ResourceDirectory这个TABLE 增加了 GUID列 为了好实现数结构 using System; using System.IO; using System.Data; using System.Collections; namespace PETEST { /// <summary> /// PeInfo 的摘要说明。 /// zgkesina.com …

10 个深恶痛绝的 Java 异常。。

异常是 Java 程序中经常遇到的问题&#xff0c;我想每一个 Java 程序员都讨厌异常&#xff0c;一 个异常就是一个 BUG&#xff0c;就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章&#xff1a;一张图搞清楚 Java 异常机制。今天&#xff0c;栈长来列一下 J…

POJ 2777 - Count Color(线段树区间更新+状态压缩)

题目链接 https://cn.vjudge.net/problem/POJ-2777 【题意】 有一个长度为 LLL 的区间 [1,L][1,L][1,L] &#xff0c;有 TTT 种颜色可以涂&#xff0c;有 QQQ 次操作&#xff0c;操作分两种C A B CC \ A \ B \ CC A B C 把区间 [A,B][A,B][A,B] 涂成第 CCC 种颜色P A BP \ A \ …

如何实施成功的数据清理流程

干净的数据是发现和洞察力的基础。 如果数据很脏&#xff0c;您的团队为分析&#xff0c;培养和可视化数据而付出的巨大努力完全是在浪费时间。 当然&#xff0c;肮脏的数据并不是新的。 它早在计算机变得普及之前就困扰着决策。 现在&#xff0c;计算机技术已普及到日常生活中…

nginx前端代理tomcat取真实客户端IP

nginx前端代理tomcat取真实客户端IP2011年12月14日⁄ nginx⁄ 暂无评论⁄ 被围观 3,000 次使用Nginx作为反向代理时&#xff0c;Tomcat的日志记录的客户端IP就不在是真实的客户端IP&#xff0c;而是Nginx代理的IP。要解决这个问题可以在Nginx配置一个新的Header&#xff0c;用来…

kubeadm安装kubernetes 1.13.2多master高可用集群

1. 简介 Kubernetes v1.13版本发布后&#xff0c;kubeadm才正式进入GA&#xff0c;可以生产使用,用kubeadm部署kubernetes集群也是以后的发展趋势。目前Kubernetes的对应镜像仓库&#xff0c;在国内阿里云也有了镜像站点&#xff0c;使用kubeadm部署Kubernetes集群变得简单并且…

通才与专家_那么您准备聘请数据科学家了吗? 通才还是专家?

通才与专家Throughout my 10-year career, I have seen people often spend their time and energy in passionate debates about what data science can deliver, and what data scientists do or do not do. I submit that these are the wrong questions to focus on when y…