python问题求助-关于a+=b与a=a+b的问题

在看apriori的算法,决定自己练练手,写写代码。最近又在学python,所以准备用python实现。其中一个子过程是要求候选项Ck的k项子集。在这个求子集的方法中遇到了问题了,并且很神奇。最开始一直找不到问题所在,当单步调试发现问题所在之处时却倍感神奇。下面用代码示例来说明下这个问题的神奇之处。

# coding=UTF-8 
'''
Created on Mar 11, 2012
@author: tanglei|www.tanglei.name
'''

elements=[['1'],['2'],['3']] 
def getSubset(k,size):
    subset=[]
    if k == 1:
        subset += (elements[0:size])
        return subset
    else:
        i = size - 1
        while i >= k-1 :
            set = getSubset(k-1,i)
            j = 0
            while j < len(set):
                #Attention a+=b  a=a+b  
                             #set[j] += (elements[i]) #Why Elements change here?                              set[j] = set[j] + (elements[i])
                j += 1
            subset += (set)
            i -= 1
        return subset
print("elements:",elements)    
test = getSubset(2,len(elements))
print(test)
print("elements",elements)

本例中是求集合[[‘1’],[‘2’],[‘3’]]的2-itemset子集。 看如上代码中,红色那句先注释掉,用a=a+b的形式,运行结果如下。这个结果是正确的,为{1,3}、{2,3}、{1,2}。

clip_image002

若将代码中换成a+=b的形式,即去掉蓝色代码部分,换成红色的代码。意料中,应该结果一样。但实际结果却出乎意料。

python_a =b_a=a b 1

不但子集没求对,就连原始的集合elements都被改变了。看了好久搞不定是哪里出了问题了。之前对a+=b和a=a+b的印象仅仅停留在涉及一个强制类型转换的原因,难道这个也是吗?搞不懂,像高人求助……

p.s顺便求一个代码高亮的插件,既能良好展示代码,又能自定义代码的某句的格式,比如本页中的的那两句有颜色代码,自定义格式了就不能用之前用的插件了。用那个插件,就又不能自定义格式了。本人用codecolorer,既想保持有良好的代码格式体现,又想能用于本页中,自己加font这样的标签,用于提到哪句代码更方便。现在本页是用了两段codecolorer的inline格式,加自定义font color属性的两句代码,给拼起来的,实在麻烦。