python中的指针
python中也是存在指针的,只不过平常一般看不到也用不到,被解释器给包装起来了。
这是与C语言的区别之处。
比如运行下面的代码:
a = [1, 2, 3]
b = a # 不是复制列表,而是把 b 也指向同一块列表对象
b.append(4)
print(a) # [1, 2, 3, 4] # 两边同时看到改动
输出结果是 [1, 2, 3, 4]
这是因为变量a,b同时指向一个内存,所以会同步变动。
打个比方说,就好像是一个抽屉,在里面放了[1,2,3],然后a相当于是一把钥匙指向这个抽屉,
后面的b = a相当于是又配了一把钥匙,但是指向的抽屉还是同一个。
b.append(4)相当于是钥匙b打开抽屉放了一个新元素进去,
print(a) 相当于是用钥匙a重新打开抽屉查看,这时候自然会看到[1, 2, 3, 4]
那么,如果我不想让a,b同步变化,该怎么办呢?
可以这样:
a = [1, 2, 3]
b = a.copy() # 或 list(a)、a[:]、copy.deepcopy(a)
b.append(4)
print(a) # [1, 2, 3] 原列表没变
print(b) # [1, 2, 3, 4]
这里的b = a.copy() 就相当于是新开了一个抽屉,自然就不会相互影响了。
还有另外一种情况,也是需要注意的:
a = []
b = a
a = [3]
print(a,b)
运行这段代码,会输出 [3] []
为什么这时候就不同步了呢?这是因为a = [3] 这个语句就不再是往抽屉里面放东西了,
而是相当于新建了一个抽屉,并把a的箭头给“掰过去”
所以打开b抽屉,还是原来的那个空抽屉,打开a抽屉,就是另一个抽屉了。
最后,还有个小细节,那就是list.append这个函数是属于原地修改列表,而不会返回任何值。
举个例子,
a = []
b = a.append(3)
print(a,b)
运行之后会输出 [3] None
这是因为a.append(3)默认返回None,而不是修改后的列表。
想要把修改后的列表赋值给b的话,这样改动一下就好了:
a = []
a.append(3)
b = a
print(a,b)
这样运行出来就是 [3] [3]了。
2286

被折叠的 条评论
为什么被折叠?



