Python学习笔记(6-1):若干细节知识
文章导读
- 课程难度:★★★☆☆
- 预计学习时间:40分钟
- 简介:本节主要讲解了运用python进行数据分析时,一些导致数据分析代码不能如期运行的原因及解决方案,包括:(1)可变元素作为函数参数时可能修改原值的问题及解决方案;(2)对pandas数据结构的访问失败原因及索引重建问题;
- 重点涉及的函数和内容:(1)copy.copy()、copy.deepcopy();(2)pd.reset_index();
前言
在真正开始利用学到的一些知识完成数据分析任务之前,这里再花两节的篇幅对python在数据分析领域有用的部分知识做一些细节的补充,这些知识在开展真正的数据分析项目中基本都用得上。
一、可变元素作为函数参数时是否会修改原值
之前讲过,字符串和元组可以通过下标和切片进行访问,但是不可修改里面的元素。字典只能通过“键”访问,可以修改里面的元素。集合不能通过下标访问,当然集合也没有键。因此我们主要围绕列表(list)在作为函数参数时的一些数据修改问题。同时作为类比,这里也会观察numpy数组、Series和DataFrame作为函数参数的数据修改问题。
1、参数为数值或字符串时
函数调用时,参数为数值和字符串类型时是不会修改原值的,具体示例如下:
def fun(value):
value = value + 1
return 0
a = 100
fun(a)
print(a)
def fun(value):
value = value + 'tmp'
return 0
a = 'qwe'
fun(a)
print(a)
两个函数调用的输出结果分别如下:
100
qwe
2、函数修改可变类型数据的下层元素时
函数对列表、numpy数组、Series和DataFrame等可变类型数据的下层元素进行修改时,则会修改原值。例如我们定义一组函数,分别对列表、numpy数组和DataFrame进行类似的处理:
def pcs(LIST):
LIST[1:3] = [-1, -1]
LIST.append([0, 0])
LIST.extend([12, 12])
LIST + [13, 14]
LIST += [15, 16]
return 0
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(pcs(a))
print(a)
输出结果如下:
0
[1, -1, -1, 4, 5, 6, 7, 8, 9, [0, 0], 12, 12, 15, 16]
由此我们可以注意到,由于只有 +
不改原值,所以除LIST + [13, 14]
这一项之外,其余的修改都被反映到原值上去了。
3、避免数据传入函数后改变原值的方法
如果希望一个列表被我们传递进函数时处理后原值不被改变,我们应用的最多的方式是传入原列表的复制,这样原始列表就不会因为函数的调用而发生改变。关于一个列表的复制,有下面几种方式:
(1)传入列表的切片作为参数
原理:修改列表切片能影响原值,原值做函数参数能影响原值,但是切片做函数参数时,是不会修改原值的。基于这种思路的操作方式就是,虽然我们还是处理一个a,但是处理a的时候,对a进行切片,但切片取整个的a。如此,传入这个新列表后后原列表就不会发生修改:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(pcs(a[:]))
print(a)
输出结果如下:
0
[1, 2, 3, 4, 5, 6, 7, 8, 9]
(2)传入原列表+空列表作为参数
原理:因为 +
返回的也是一个新列表,而不会影响原列表。所以我们传入一个现有列表的基础上直接加一个空列表,传参传的就是一个与a一样的新值,也能解决问题:
a = [1, 2, 3, 4, 5, 6,