唐磊的个人博客

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属性的两句代码,给拼起来的,实在麻烦。

tanglei wechat
欢迎扫描二维码关注我的微信公众号