被疏忽的一段Python語法

2021-05-10 00:41:38 字數 1093 閱讀 2269

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)]

# ...

重要的一段

2006 6 23 22 44 00 重要的一段 這幾個月都用在開發心電監護系統上了,終於告一段落,倍感輕鬆。欣慰的是,有了成果,並且成果正走在產品化路上。5月31日,孕育 設計監護儀樣機結構和pcb 6月7日,生日 pcb板製好,開始焊接和除錯 6月17日,tata,監護儀終於可以見人了。介紹一下...

忙碌的一段日子

最近不是一般的忙,在做lotus foundations 的售前資料,和maximo的售前產品研究。乙個是新推出的產品系列,乙個是未曾接觸過的高階資產管理軟體,maximo雖然被ibm收購,但技術尚未接管,這是個很大的麻煩,所以,我幾乎沒有什麼資料可查。都是從網上找來各種各樣的文章,資料,自己研究,...

一段新的旅程

不知道這麼多年天我是怎樣走過來的,似乎什麼都不知道,什麼都不清楚,就這樣一路撞到了今天。自從到了大學我以為我變了我更加開朗了更加活潑了和以前完全不一樣了變得越來越好了。可是,不過是以為而已。慢慢放下了筆,未竟的 再也沒有看下去。拿起了手機,未讀的書在手邊很少有興趣去翻閱。開啟了英雄聯盟,對著未完成 ...