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 A:pass
A既是个类,也是个对象,相当于A = CLASSOBJ(“pass”)
因此类是一个可以产生其他对象的对象,所以类都要用到self
C++和Java中,类就不是对象
因此在python中类可以像其他对象一样做赋值和传递操作
Python中每个对象对应着一个类,任何对象的类都可以通过内建类type来查看
Type返回的也是一个对象,而且是一个类对象,类对象自身作为一个对象,其类为type
Type是所有类对象的类,type本身也是一个类对象,其类是自身
Type(type)中两个type是一样的,将自身作为一个参数来调用自身
Type的基类是object类,object的基类是没有的,None
Object既是type的基类,有时type的对象
一般而言。我们都是先定义基类,然后定义子类,先定义类,然后用类来生成对象。
- python基础学习(3)
- Python基础学习(3)
- Python基础学习3
- Python零基础学习(3)
- python学习(3)python基础、使用list和tuple
- Python 学习(3):基础知识点
- python基础学习(一)
- Python 基础学习(一)
- python 基础学习(一)
- Python基础学习(一)
- Python基础学习(二)
- python基础学习(1)
- python基础学习(1)
- python基础学习(2)
- python基础学习(4)
- python基础学习(5)
- python基础学习(6)
- python基础学习(2)
- 将一个字串中含有全角的数字字符、字母、空格或'%+-()'字符转换为相应半角字符
- Java字符流操作
- linux shell 时间运算以及时间差计算方法
- webdriver定位元素的方法和基础函数的使用
- 模拟基于ajax调后台接口的json数据
- python基础学习(3)
- POJ2153
- eclipse启动了tomcat,浏览器可以访问tomcat下的项目但不能访问tomcat主页
- gym100206E (n*n)的马遍历问题 贪心
- mysql入门(外连接十)
- Pandas Index 属性
- Redis常用操作命令
- 使用node-inspector调试NodeJS代码
- Linux下VI的基本操作实验