鱼C论坛

 找回密码
 立即注册
查看: 8041|回复: 5

关于函数作用域问题,使用DataFrame作为参数

[复制链接]
发表于 2016-6-7 10:15:02 | 显示全部楼层 |阅读模式
20鱼币
主要问题是,定义一个函数,其中一个参数为DataFrame,何时会对原来的DataFrame进行操作,何时不会?如何确保不会?如何确保会?

例如:
  1. import pandas as pd
  2. import numpy as np
  3. from pandas import DataFrame,Series
  4. a=DataFrame(np.arange(12).reshape(3,4))
复制代码


第一个函数:
  1. def test1(df):
  2.     df=df+1
  3.     return df
  4. b=test1(a)
  5. a
  6. b
复制代码

这时发现a没有变化,而b为函数运行后的结果

第二个函数
  1. def test2(df):
  2.         df[0]+=1 #对传入的df的第一列+1
  3.         return df
  4. c=test2(a)
  5. a
  6. c
复制代码

这时发现a和c均为函数运行后的结果(即a发生了改变)。

求解:何时会对原来的DataFrame进行操作,何时不会?如何确保不会?如何确保会?

最佳答案

查看完整内容

先看看你的a是一个什么类型,如果是一个不可变类型,比如整形,调用函数后a就不会改变,如果是可变类型,如列表,就会改变
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-7 10:15:03 | 显示全部楼层
先看看你的a是一个什么类型,如果是一个不可变类型,比如整形,调用函数后a就不会改变,如果是可变类型,如列表,就会改变
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-7 13:55:51 | 显示全部楼层
挥舞乾坤 发表于 2016-6-7 10:53
先看看你的a是一个什么类型,如果是一个不可变类型,比如整形,调用函数后a就不会改变,如果是可变类型,如列表, ...

传入的参数是可变的,类型是DataFrame,如果要进行test2函数的操作,但是不想影响到a,应该如何做?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-7 20:47:04 From FishC Mobile | 显示全部楼层
bp2018 发表于 2016-6-7 13:55
传入的参数是可变的,类型是DataFrame,如果要进行test2函数的操作,但是不想影响到a,应该如何做?

用copy模块的deepcopy
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-9 22:24:30 | 显示全部楼层
挥舞乾坤 发表于 2016-6-7 20:47
用copy模块的deepcopy

如果数据量很大,copy一个新数据的时间也不短。。。有没有不用copy的办法?谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-10 16:03:33 | 显示全部楼层
试了一下不用copy那么麻烦,用切片就可以:
  1. def fun(a):
  2.     b = a[:]
  3.     b += [3]
  4.     return b
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-21 07:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表