【Python】 零碎知识积累 III

零碎积累 III

■  函数的参数默认值在函数定义时确定并保存在内存中,调用函数时不会在内存中新开辟一块空间然后用参数默认值重新赋值,而是单纯地引用这个参数原来的地址。这就带来了一个坑,那就是当你在函数体中对默认参数做一些改变的时候,若参数默认值是int,str这种不可变类型,那么还好,因为默认参数在内存中并没改变,只是参数指向另一块空间;但若是list这种可变类型,当你对默认参数做改变的时候,将会直接影响这个参数在内存中实际的值,这也就影响了下次调用这个函数时参数的默认值。比如:

def foo(para=1):
    para += 1
    print para
>>>foo()
2
>>>foo()        #第二次调用结果不变
2

def foo(para=[1])
    para.append(1)
    print para
>>>foo()
[1,1]
>>>foo()    #第二次调用会显示出第一次调用过程中的一些影响,因为默认参数值是个可变型数据结构,对其所做的改变会真实反应到内存中去
[1,1,1]

■  获取当前脚本的绝对路径

  os.path.abspath(__file__)

  __file__这个魔法变量的意思是指代文件本身

■  判断某个类是否有某个属性(变量或者方法)用hasattr函数。这个函数有两个参数,第一个是一个类的实例,第二个是个字符串来指出想要检查的属性名。比如:

  令s = "hello". s就是个字符串了。然后hasattr(s,"strip")就是判断s这个实例有没有名为strip的属性。事实上字符串有strip这个方法,所以返回True

■  第三方模块charset可以检测字符串的编码格式,安装用pip install charset

  使用charset.detect("一个字符串")

  需要注意的是直接输入一个中文字串似乎只是查看这个文件默认的编码格式而已,因为中文被存进内存的时候会被python用默认编码格式处理一下。

■  想要查看某个模块的源码之类的情况,需要知道这个模块的路径。可以在python中import这个模块之后,在pythonshell中直接键入模块名,就会显示路径了。

■  list类增加成员有很多种方法,比如:

  [1].append(2)  //前两种方法都是直接对内存中list本身的内容做修改。

  [1].extend([2])

  [1]+[2]  //这种方法其实是要在内存中建立一个新的list对象来盛放两个老list合起来的内容

  从运行速度的效果来看,第三种是最慢的因为要建立一个新对象

■  关于可变&不可变对象 数据在内存中的形态

  其实这点内容应该是学python时最早就应该懂的,我当时学的时候没在意太多,现在还要回过头来再仔细看一遍。。

  在python之中,一切皆对象。意思是说,一个变量或者函数之类的,只是引用了内存中存在的一些实在的数据而并不被直接存进内存。这就引出了一个问题,当我对变量的值进行一些改变时,是让变量换一个引用对象呢还是说直接在当前引用对象上修改呢?另外,当我增加一个变量,值和现在的变量一样,它引用的是同一片内存空间呢还是说引用另一片内存空间只是内容一样呢?这个区别就是不可变和可变类型的区别。

  对于int,str,tuple这种不可变类型。相同的值的变量引用的是同一个对象,改变变量的值相当于改变这个变量的引用,使之指向另一个对象了:

>>>x = 1
>>>y = 1
>>>id(x) == id(y)
True
>>>x += 1
>>>id(x) == id(y)
False

  对于list,dict这种可变类型。相同的值的变量引用的也是不同的对象。改变变量的值相当于直接在内存中的对象上做改变但变量的引用关系不变:

>>>x=[1]
>>>y=[1]
>>>id(x) == id(y)
False
>>>oldXID = id(x)
>>>x.append(2)
>>>id(x) == oldXID
True

  总的来看,不可变类型的好处是多个等值变量可以只引用一个对象,节省内存。但变量值变化较多的情况就要创建出各种各样的对象来,就不是很好了。

  顺便一提,在判断相等时的is和==也是这个差别。is判断的是是不是引用对象一致。而==判断的只是引用对象的值是不是一致。

时间: 2024-08-19 07:07:46

【Python】 零碎知识积累 III的相关文章

【Python】 零碎知识积累 II

零碎积累II ■ global关键字用于把跟着的变量声明为全局变量.在看似不属于其的命名空间里也可以引用它. ■ 讲一个一维列表二维化的方式,用简单的一行语句来表达: [[array[rows*y+cols] for cols in range(y)] for rows in range(x)] #array是一个一维列表(或者数组),x表示二维化后的行数,y表示列数 ■ 想用C,java里面的switch语句结构,但是python里没有的时候,可以 1.  搞很多个if判断,不过这样很繁琐 2

【转】Python零碎知识(2):强大的zip

转自:http://www.cnblogs.com/BeginMan/archive/2013/03/14/2959447.html 这篇博文讲的挺好的 一.代码引导 首先看这一段代码: 1 >>> name=('jack','beginman','sony','pcky') 2 >>> age=(2001,2003,2005,2000) 3 >>> for a,n in zip(name,age): 4 print a,n 5 6 输出: 7 jac

[转]Python零碎知识(2):强大的zip

一.代码引导 首先看这一段代码: 1 >>> name=('jack','beginman','sony','pcky') 2 >>> age=(2001,2003,2005,2000) 3 >>> for a,n in zip(name,age): 4 print a,n 5 6 输出: 7 jack 2001 8 beginman 2003 9 sony 2005 10 pcky 2000 再看这一段代码: 1 all={"jack&qu

python零碎知识点积累

#1.map是3.X中的生成器 #2.建立字典的方法 bob = dict(name='Bob Smith', age=42, pay=3000, job='dev') names = ['name', 'age', 'pay', 'job'] values = ['Sue Jones', 45, 40000, 'hdw'] dict(zip(names,values) fields = ('name', 'age', 'job', 'pay') record = dict.fromkeys(f

python2.7的知识积累

参考http://blog.csdn.net/jcjc918/article/details/9354815 http://blog.sina.com.cn/s/blog_6fb8aa0d0101qtt9.html http://stackoverflow.com/questions/3505831/in-python-how-do-i-convert-a-single-digit-number-into-a-double-digits-string 今天晚上折腾了一下python,主要是去跑通

Python基础知识思维导图|自学Python指南

微信公众号[软件测试大本营]回复"python",获取50本python精华电子书. 测试/开发知识干货,互联网职场,程序员成长崛起,终身学习. 现在最火的编程语言是什么?答案就是Python. 人生苦短,我用Python Python的特点: Python一直是位于编程语言排行榜的前三位, Python遵循"简单.优雅.明确"的设计哲学,语法简单易懂,而且Python的中文文档也于2019年3月份发布,各种开发环境也越来越简单. Python免费开源. Pytho

python爬虫Pragmatic系列III

python爬虫Pragmatic系列III 说明: 在上一篇博客中,我们已经学会了从赶集网上的一家公司中提取出有关的信息,并存储到Excel中. 本次目标: 在本节中,我们将批量下载赶集首页上所有的公司界面(注意不是赶集网上所有的公司页面,我们可以把这个留给之后的任务),并批量的处理所有公司的有关信息,并保存到Excel中. 注意: 在上一篇博客中,我们使用的只是匹配赶集网上其中一家公司界面的中信息,而且不幸的是,很多的其他的公司的联系店主模块中的信息数量并不是固定的,即有的是10个li,而有

c/c++面试题(7)零碎知识总结

1.变量的声明和定义有什么区别? 声明:变量的声明做了两件事情 a.告诉编译器这个变量已经匹配到一块内存上了,下面的代码用到的变量或对象是在别处定义的. 声明可以出现很多次. b.告诉编译器这个变量名已经被我占用了,其他的的变量将不能再使用. 定义:告诉编译器创建一个对象,为这个对象分配一块内存并给它取一个名字,这个名字就是常说的 变量名或对象名.同一变量或对象的定义只能出现一次. 本质区别:声明没有分配内存,而定义则是创建了对象并为这个对象分配了一块内存. 2.sizeof和strlen之间的

python基础知识总结

python有段时间没用了,实在是惭愧啊,屌丝今天决定开始对python基础知识重新进行总结,以慰自心. 一.python概念 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. python定位"优雅","简单","明确" 二.python安装 略 三.python基础 1.数据类型 整数: Python可以处理任意大小的整数,当然包括负整数,在程序