python学习——一些有趣的讨论
2013-05-25 14:55
316 查看
由于底层的c实现,python中的指针问题也成为了一个大问题,得好好研究
1) 共享引用
由于python中,万物皆对象,所以赋值总是代表着引用的copy,很好的一个例子
python 代码
>>> X = [1, 2, 3]
>>> L = ['a', X, 'b']
>>> D = {'x':X, 'y':2}
>>> L
['a', [1, 2, 3], 'b']
>>> D
{'y': 2, 'x': [1, 2, 3]}
>>> X[1] = 'aha'
>>> X
[1, 'aha', 3]
>>> L
['a', [1, 'aha', 3], 'b']
>>> D
{'y': 2, 'x': [1, 'aha', 3]}
有程序设计经验的人很容易明白上面的代码,当我们在L,D中使用X时,实际上是把[1, 2, 3]这个列表的地址放到了L,D中X的位置上,当[1, 2, 3]中元素改变时,地址并没有变,所以L,D也跟着变。
python 代码
>>> s = 'abc'
>>> l = [1, 2, s]
>>> l
[1, 2, 'abc']
>>> s = 'def'
>>> l
[1, 2, 'abc']
这段代码有人就该迷糊了,s不是指向的是一个字符串地址吗,l中相应的位置也是这个地址啊,s改变了,为什么l不变?呵呵,原因就是字符串是不可遍的,当我们把'def'赋给s时,s所指向的地址就变了,而l中s的位置还是存的'abc'的地址,这就是l不变的原因。
还有一个有趣的例子
python 代码
>>> L = [1, 2]
>>> X = L * 2
>>> X
[1, 2, 1, 2]
>>> Y = [L] * 2
>>> Y
[[1, 2], [1, 2]]
>>> L[1] = 'aha'
>>> X
[1, 2, 1, 2]
>>> Y
[[1, 'aha'], [1, 'aha']]
实际上X的效果类似[1, 2] + [1, 2],Y的效果类似[L] + [L] = [L, L],这回该明白了吧。
2)比较
java中比较有==,<=,>=,equals,comparaTo等等。python中比较是==,<=,>=,is,is not。当我们使用python的比较时,它会自动比较两个对象中内部的数据结构。啥也不说了,例子是最好的teacher
python 代码
>>> L1 = [1, ('a', 3)]
>>> L2 = [1, ('a', 3)]
>>> L1 == L2
True
>>> L1 is L2
False
>>> L1 < L2
False
>>> L1 > L2
False
>>> L2[1] = ('a', 2)
>>> L2
[1, ('a', 2)]
>>> L1 < L2
False
>>> L1 > L2
True
3) 消除指针影响
对于向列表和字典那样的可变类型来说,有时我们不需要指针式的引用(在java中,也有类似的需求),实际上解决起来很简单,例子说明一切
python 代码
>>> L = [1, 2, 3]
>>> M = ['x', L[:], 'y']
>>> M
['x', [1, 2, 3], 'y']
>>> L[1] = 'aha'
>>> L
[1, 'aha', 3]
>>> M
['x', [1, 2, 3], 'y']
转载自: http://yangsq.iteye.com/blog/128641学到一些东西,记一下:list的切片操作,实际上是新的拷贝的操作.列表L当只是进行引用时,写上L,就是其引用使用L * 3之类的运算操作时,L会使用值,意即得出的新数据实际上不再与L有关联.但使用[L] * 3之类的运算操作,L会使用引用,意即得出的新数据关联于L字符串在python中不可变,所以为一个变量新赋上值时原值在拥有其他引用的情况下是不会改变的.
1) 共享引用
由于python中,万物皆对象,所以赋值总是代表着引用的copy,很好的一个例子
python 代码
>>> X = [1, 2, 3]
>>> L = ['a', X, 'b']
>>> D = {'x':X, 'y':2}
>>> L
['a', [1, 2, 3], 'b']
>>> D
{'y': 2, 'x': [1, 2, 3]}
>>> X[1] = 'aha'
>>> X
[1, 'aha', 3]
>>> L
['a', [1, 'aha', 3], 'b']
>>> D
{'y': 2, 'x': [1, 'aha', 3]}
有程序设计经验的人很容易明白上面的代码,当我们在L,D中使用X时,实际上是把[1, 2, 3]这个列表的地址放到了L,D中X的位置上,当[1, 2, 3]中元素改变时,地址并没有变,所以L,D也跟着变。
python 代码
>>> s = 'abc'
>>> l = [1, 2, s]
>>> l
[1, 2, 'abc']
>>> s = 'def'
>>> l
[1, 2, 'abc']
这段代码有人就该迷糊了,s不是指向的是一个字符串地址吗,l中相应的位置也是这个地址啊,s改变了,为什么l不变?呵呵,原因就是字符串是不可遍的,当我们把'def'赋给s时,s所指向的地址就变了,而l中s的位置还是存的'abc'的地址,这就是l不变的原因。
还有一个有趣的例子
python 代码
>>> L = [1, 2]
>>> X = L * 2
>>> X
[1, 2, 1, 2]
>>> Y = [L] * 2
>>> Y
[[1, 2], [1, 2]]
>>> L[1] = 'aha'
>>> X
[1, 2, 1, 2]
>>> Y
[[1, 'aha'], [1, 'aha']]
实际上X的效果类似[1, 2] + [1, 2],Y的效果类似[L] + [L] = [L, L],这回该明白了吧。
2)比较
java中比较有==,<=,>=,equals,comparaTo等等。python中比较是==,<=,>=,is,is not。当我们使用python的比较时,它会自动比较两个对象中内部的数据结构。啥也不说了,例子是最好的teacher
python 代码
>>> L1 = [1, ('a', 3)]
>>> L2 = [1, ('a', 3)]
>>> L1 == L2
True
>>> L1 is L2
False
>>> L1 < L2
False
>>> L1 > L2
False
>>> L2[1] = ('a', 2)
>>> L2
[1, ('a', 2)]
>>> L1 < L2
False
>>> L1 > L2
True
3) 消除指针影响
对于向列表和字典那样的可变类型来说,有时我们不需要指针式的引用(在java中,也有类似的需求),实际上解决起来很简单,例子说明一切
python 代码
>>> L = [1, 2, 3]
>>> M = ['x', L[:], 'y']
>>> M
['x', [1, 2, 3], 'y']
>>> L[1] = 'aha'
>>> L
[1, 'aha', 3]
>>> M
['x', [1, 2, 3], 'y']
转载自: http://yangsq.iteye.com/blog/128641学到一些东西,记一下:list的切片操作,实际上是新的拷贝的操作.列表L当只是进行引用时,写上L,就是其引用使用L * 3之类的运算操作时,L会使用值,意即得出的新数据实际上不再与L有关联.但使用[L] * 3之类的运算操作,L会使用引用,意即得出的新数据关联于L字符串在python中不可变,所以为一个变量新赋上值时原值在拥有其他引用的情况下是不会改变的.
相关文章推荐
- 菜鸟学习OpenCV(Python)碰到的一些小问题
- 学习python的一些资料(收集,随时更新)
- python学习笔记: 一些有用的文件操作函数
- python中字符串类型的一些学习总结
- python 学习过程中的一些疑问
- [转贴][Python]收集的一些python程序,实用并且有趣
- python学习的一些总结
- Python学习-31.Python中集合的一些操作
- Python学习笔记——一些常用函数、常见错误总结
- 学习python的一些心得和经验
- 如何学习Python的一些总结
- 一些关于Python的基础知识 - 千月的python linux 系统管理指南学习笔记(3)
- Python学习(一):入门篇:python中的一些数据结构
- python学习笔记:python 2与python 3的一些小区别
- 新手学习python一些记录
- python基础学习中发现的一些小知识
- 学习python中的一些问题--centos下django连接mysql配置
- python基础教程_学习笔记15:标准库:一些最爱——fileinput
- Python学习(2)一些和C不同的基本语法
- Python 一些有趣的技巧