191145692 发表于 2017-4-29 14:13:21

python学习——一些有趣的讨论

  由于底层的c实现,python中的指针问题也成为了一个大问题,得好好研究
  1) 共享引用
  由于python中,万物皆对象,所以赋值总是代表着引用的copy,很好的一个例子
python 代码

[*]>>> X =    
[*]>>> L = ['a', X, 'b']   
[*]>>> D = {'x':X, 'y':2}   
[*]>>> L   
[*]['a', , 'b']   
[*]>>> D   
[*]{'y': 2, 'x': }   
[*]>>> X = 'aha'   
[*]>>> X   
[*]   
[*]>>> L   
[*]['a', , 'b']   
[*]>>> D   
[*]{'y': 2, 'x': }  

  有程序设计经验的人很容易明白上面的代码,当我们在L,D中使用X时,实际上是把这个列表的地址放到了L,D中X的位置上,当中元素改变时,地址并没有变,所以L,D也跟着变。
python 代码

[*]>>> s = 'abc'   
[*]>>> l =    
[*]>>> l   
[*]   
[*]>>> s = 'def'   
[*]>>> l   
[*]  

  这段代码有人就该迷糊了,s不是指向的是一个字符串地址吗,l中相应的位置也是这个地址啊,s改变了,为什么l不变?呵呵,原因就是字符串是不可遍的,当我们把'def'赋给s时,s所指向的地址就变了,而l中s的位置还是存的'abc'的地址,这就是l不变的原因。
  还有一个有趣的例子
python 代码

[*]>>> L =    
[*]>>> X = L * 2   
[*]>>> X   
[*]   
[*]>>> Y =  * 2   
[*]>>> Y   
[*][, ]   
[*]>>> L = 'aha'   
[*]>>> X   
[*]   
[*]>>> Y   
[*][, ]  

  实际上X的效果类似 + ,Y的效果类似 + = ,这回该明白了吧。
  2)比较
  java中比较有==,<=,>=,equals,comparaTo等等。python中比较是==,<=,>=,is,is not。当我们使用python的比较时,它会自动比较两个对象中内部的数据结构。啥也不说了,例子是最好的teacher
python 代码

[*]>>> L1 =    
[*]>>> L2 =    
[*]>>> L1 == L2   
[*]True  
[*]>>> L1 is L2   
[*]False  
[*]>>> L1 < L2   
[*]False  
[*]>>> L1 > L2   
[*]False  
[*]>>> L2 = ('a', 2)   
[*]>>> L2   
[*]   
[*]>>> L1 < L2   
[*]False  
[*]>>> L1 > L2   
[*]True  

  3) 消除指针影响
  对于向列表和字典那样的可变类型来说,有时我们不需要指针式的引用(在java中,也有类似的需求),实际上解决起来很简单,例子说明一切
python 代码

[*]>>> L =    
[*]>>> M = ['x', L[:], 'y']   
[*]>>> M   
[*]['x', , 'y']   
[*]>>> L = 'aha'   
[*]>>> L   
[*]   
[*]>>> M   
[*]['x', , 'y']  
页: [1]
查看完整版本: python学习——一些有趣的讨论