在之前的一篇文章中,我们解释了一下为什么下面的两种方式是不同的:
bucket = [[] for _ in range(len(nums)+1)]
bucket1 = [[]] * (len(nums) + 1)
第一种生成的bucket中每个list都是不同的list object ,而第二个bucket中的每个list都是相同的list object。为什么呢?这就涉及到Python中深浅拷贝的知识,接下来,我们就详细介绍一下。
1、Python对象赋值
我们先来看一下下面的一段代码:
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = will
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
上段代码的输出为:
下面来分析一下这段代码:
1)首先,创建了一个名为will的变量,这个变量指向一个list对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同)
2)然后,通过will变量对wilber变量进行赋值,那么wilber变量将指向will变量对应的对象(内存地址),也就是说"wilber is will","wilber[i] is will[