python基础学习(3)

来源:互联网 发布:马赛克软件下载 编辑:程序博客网 时间:2024/06/05 18:12

一些网上和书上整理出来的加上自己理解的内容,如果有错误的话也请教一下,谢谢!
20. 值传递问题:
java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?
答案是 值传递 值传递!Java中只有按值传递,没有按引用传递!
http://guhanjie.iteye.com/blog/1683637详细且经典
对象在对内存中开辟,变量名在栈内存开辟,存储的是引用对象在对内存的起始地址
http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html中详细的介绍了Java中的栈和堆内存,堆主要用来存放对象的,栈主要是用来执行程序的
这里写图片描述
所以传递的时候是将变量名在栈内存中的值(即在堆内存中的起始地址)传给了函数的临时变量,之后的操作都是对于临时变量的操作,完全符合值传递的要求,之后的操作因为地址指向堆中对象,所以改变了对象内容。
Python中和Java中同样是不能对值类型进行改变,其改变的是变量名指向了一个新的对象。
值类型:对象本身不允许修改,比如字符串,数值,元组
引用类型:对象本身可以修改,比如列表,字典等
http://blog.csdn.net/xhw88398569/article/details/48688115
我们对字符串,数值的修改实际上是让变量指向了一个新的对象


Python中
A = 1000
B = 1000
结果是创建了2个1000,两个引用
这里写图片描述
可以看出在10000和1的时候出现了不同,这是因为python在启动的时候对一些“常用整数”自动创建好了,这样一来碰到这种整数的时候就不用内存申请和释放开销了
范围是 -5 ~ 256
这里写图片描述我们可以看到两者之间的区别 这里写图片描述
第一个是创建了两个对象 is 是判断是否为一个对象,而 == 是判断值是否相等
第二个是创建了一个对象被两个引用

再关于容器里的对象:
Python中容器(即可以包含其他对象的对象)中存放的“对象”实际都是引用,对元组中对象的操作都是对引用的操作

Python中对象分为两种,一种是可变对象,另一种是不可变对象
对于 += 操作:
这里写图片描述
在对整数运算时,我们可以看到 a += 1 相当于 a = a + 1,所以每次都进行一个对象的创建
这里写图片描述在对列表进行运算时,+= 操作相当于是对列表进行拼接操作,而对于
L= L+[4] 来说则是创建了L对象先进行右边的L + [4] 操作,新建了一个list然后将新的list用L引用
Extend和 += 是一样的对于可变对象,在list中,右边不一定要list,只要是一个迭代器就行;
Python认为 += 和先加再赋值,是不同的意义,+= 只是一个运算操作,而extend则涉及到了查找函数和调用函数
因此extend比 += 要慢
不可变对象就内置的几个,int float str tuple(元组) complex …需要“改变”这几个对象的内容(其实无法改变),只有新建一个对象
在tuple(元组)中添加 += 元素是重新新建了一个tuple对象,因此在代码中那种需要经常改变内容的最好别用数组,同样不能对元组中对象进行改变
关于不可变对象很重要的一点就是dictionary(字典)中的key(或者set元素)必须是不可变对象
如果定义了一个class,用其对象来自做dictionary的key的话,不要让这个对象的内容可以被外界改变(即用私有变量的方式)

这里写图片描述在这个例子中,实际上表达式是将[ [] ] 中第一个元素(空列表)的引用重复了10个,因此改变L[0]的值后大家都变了,除非用python中copy库的接口进行深拷贝,强制指定赋值
这里写图片描述
Python中对对象的传递,赋值等都是引用的传递赋值
上述的乘法可以等价:

l = [ ]t = [ ]for i in xrang(10):l.append(t)

只是一个对象被append了10次,list容器中只存放引用
若要实现10个不同的空列表

l = [ ] for i in xrang(10):l.append( [ ] )

这样每次append的时候都会新建空列表,10个都不同,或者l = [ [] for I in range(10)]
这里写图片描述在这个例子中,有人会问第二次为啥不是输出 [2] 原因是l的默认值 [] 是和f绑定在一起,每次调用f的时候用l来引用,因此每次执行的时候只是将l引用到这个对象,并非每次都新建一个列表,这个列表是在建立f的时候建立的
Python中一切都是对象,因此函数也是对象:

def f() : pass

这个语句很对人认为是定义了一个函数,其实python中在碰到def的时候,会将下面的“代码对象”关联到函数名的引用,因此这个f就是对函数对象的引用
函数对象也可以像一般对象一样作为参数传递,即函数调用函数

def f(g) :    g()def h() :    print(“ I’m H”)>>> f(h)I’m H

在谈到类的时候,类也是对象,

class Apass

A既是个类,也是个对象,相当于A = CLASSOBJ(“pass”)
因此类是一个可以产生其他对象的对象,所以类都要用到self
C++和Java中,类就不是对象
因此在python中类可以像其他对象一样做赋值和传递操作
Python中每个对象对应着一个类,任何对象的类都可以通过内建类type来查看
这里写图片描述 这里写图片描述
Type返回的也是一个对象,而且是一个类对象,类对象自身作为一个对象,其类为type
Type是所有类对象的类,type本身也是一个类对象,其类是自身
Type(type)中两个type是一样的,将自身作为一个参数来调用自身
Type的基类是object类,object的基类是没有的,None
这里写图片描述这里写图片描述
Object既是type的基类,有时type的对象
一般而言。我们都是先定义基类,然后定义子类,先定义类,然后用类来生成对象。