看如下代码:
a=[1,2,3]
b=a
b[0]=111
print(a) #输出:[111, 2, 3]
可以看到在修改b的时候a也被修改了。
查看它们的地址可以看到:
a=[1,2,3]
b=a
print(id(a)) #2683539037576
print((id(b))) #2683539037576
可以看到a和b的地址是一样的,语句b=a,就是将列表a的首地址给了b,换句话说就是a和b都指向地址2683539037576,所以在b对这块地址的内容修改时,就相当于修改了a的数据,道理跟C语言一样。
那如何既要a中的数据又在后期不改变a的数据呢:
一个是使用list.copy()
一个是使用list[:]
这两个意思相同,以第二种为例:
a=[1,2,3]
b=a[:]
print(id(a)) #1732961443208
print((id(b))) #1732961440072
b[0]=111
print(a) #[1, 2, 3]
语句b=a[:]之后,a和b的指向不一样,所以当修改b中的内容时,a不受影响。
b=a[:],就相当于对b重新malloc了一块内存,然后将a中的数据拷贝过去了,翻译到C代码如下:
#python
b=a[:]
#C语言,数组是int型为例
int *b;
int len=sizeof(a)/sizeof(a[0]);
b=(int*)malloc(len*sizeof(int));
memcpy(b,a,len*sizeof(int));
网友评论