被疏忽的一段Python语法
python提供了有序(sequence)类型(字符串,元组,列表都是有序类型),并且提供了特殊的语法来方便对这些类型进行操作,最常用的有切片操作。同一有序类型的对象之间支持”+”操作符,用来连成一个新的有序对象,有序对象也可以与一个整数进行相乘,得到一个新的有序对象。在调试的时候,我经常使用这样的语句来打印一个分割行:print ‘-‘ * 50。在对有序类型进行“*” 或者 “+”操作的时候,要千万小心。今天,我的同事就遇到了非常郁闷的问题。看下面一段代码: #coding=gbk
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return '(%d, %d)' % (self.x, self.y)
itemList = [Point(-1, -1)] * 5
# 对列表元素进行赋值
for i in range(5):
itemList[i].x = i
itemList[i].y = i
print itemList
上面的代码创建一个包含5个Point对象的列表,然后在一个for循环中对列表中的每个对象的属性进行赋值。运行上面的代码,在屏幕上显示的结果是什么?是 [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 吗? 这段代码把我们都欺骗了。结果是:[(4, 4), (4, 4), (4, 4), (4, 4), (4, 4)]。为什么会这样呢?答案在于引用类型与值类型。[Point(-1, –1)] * 5,返回一个包含五个元素的列表,列表中的元素其实引用的是同一个对象,使用for循环在对列表进行初始化的时候,修改的其实是同一个对象的值。所以,结果就…… 一开始,我们郁闷了很长时候,谁也没意识到这个问题。在调试了许久之后才发现,哦,原来上帝在这里。只要作简单的修改,结果就会是我们想要的:
# ...
# itemList = [Point(-1, -1)] * 5
itemList = [Point(-1, -1) for i in range(5)]
# ...
相关文档:
http://www.cppblog.com/oosky/archive/2005/10/11/639.html
Lesson 1 准备好学习Python的环境
Python 的官方网址:
www.python.org
点击下面连接就可以直接下载了,这里只提供了Windows下的Python。
http://www.python.org/ftp/python/2.4.2/python-2.4.2.msi
linux版本的我就不说了,因为如果你能够使用linux并安装 ......
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
smtp协议的基本命令包括:
HELO 向服务器标识用户身份
MAIL 初始化邮件传输 mail from:
&nb ......
3. Dictionaries 字典类型
Python中,字典类型并不是顺序容器,而类似c++中的关联容器(map),Dictionaries中存储的是键/值 对,和map不同的是,Python的Dictionaries中可以存任意对象类型。Dictionaries类型也是可变的,和Lists一样,可以原地修改(通过下标修改)。
下面通 ......
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough t ......