阅读下面这段代码:
a = [1,2,3]
b = a
c = a[:]
print(b)
print(c)
运行结果为:
[1, 2, 3]
[1, 2, 3]
可以看出,b和c都为[1,2,3],但是这就能说明b和c完全相等吗?
答案是否。
再看下面这段代码:
a = [1,2,3]
b = a
c = a[:]
print(id(a))
print(id(b))
print(id(c))
# id函数用来获取对象的内存地址
运行结果为:
23572296
23572296
23754152
可以看出,a和b的内存地址相同,但c和他们的确不同,这是为什么呢,明明列表的内容是一样的,但内存地址确不一样。
我们可以这么理解,b=a将两者引用一个对象,即指向同一块内存地址,相当于b对a进行浅拷贝。
在这种情况下,对这块内存地址的内容进行修改将同时改变a和b,举个栗子:
a = [1,2,3]
b = a
a.append(4)
print(a)
print(b)
运行结果如下:
[1, 2, 3, 4]
[1, 2, 3, 4]
a和b同时发生了改变。
所以这种使用方式容易产生一些意想不到的错误,不推荐使用。
而b=a[:]则是在另一个内存地址复制一份与a相同的内容,两者的内容虽然相同,但是内存空间不同,可以说两者除了长得一样并没有其他关系,这也是比较常用的拷贝方式。
在这种情况下对a进行修改b不会发生任何改变。
a = [1,2,3]
b = a[:]
a.append(4)
print(a)
print(b)
运行结果为:
[1, 2, 3, 4]
[1, 2, 3]