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, 7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值