python pandas dataframe,是值传递还是传递引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python pandas dataframe,是值传递还是传递引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2271字,纯文字阅读大概需要4分钟。
内容图文
如果我将数据帧传递给函数并在函数内修改它,它是按值传递还是按引用传递?
我运行以下代码
a = pd.DataFrame({'a':[1,2], 'b':[3,4]})
def letgo(df):
df = df.drop('b',axis=1)
letgo(a)
函数调用后a的值不会改变.这是否意味着它是传值?
我也试过以下
xx = np.array([[1,2], [3,4]])
def letgo2(x):
x[1,1] = 100
def letgo3(x):
x = np.array([[3,3],[3,3]])
事实证明,letgo2()确实改变了xx而letgo3()却没有改变.为什么会这样?
解决方法:
简短的回答是,Python总是按值传递,但每个Python变量实际上都是指向某个对象的指针,因此有时它看起来像是传递引用.
在Python中,每个对象都是可变的或不可变的.例如,列表,dicts,模块和Pandas数据帧是可变的,并且int,字符串和元组是不可变的.可以在内部更改可变对象(例如,将元素添加到列表中),但不可变对象不能.
正如我在开始时所说,您可以将每个Python变量视为指向对象的指针.将变量传递给函数时,函数中的变量(指针)始终是传入的变量(指针)的副本.因此,如果为内部变量分配新内容,则所做的只是更改局部变量指向不同的对象.这不会改变(变异)变量指向的原始对象,也不会使外部变量指向新对象.此时,外部变量仍指向原始对象,但内部变量指向新对象.
如果要更改原始对象(仅适用于可变数据类型),则必须执行一些更改对象的操作,而不必为局部变量分配全新值.这就是为什么letgo()和letgo3()保持外部项不变,但letgo2()改变它.
正如@ursan指出的那样,如果letgo()使用类似这样的东西,那么它会改变(变异)df指向的原始对象,这将改变通过全局变量看到的值:
def letgo(df):
df.drop('b', axis=1, inplace=True)
a = pd.DataFrame({'a':[1,2], 'b':[3,4]})
letgo(a) # will alter a
在某些情况下,您可以完全挖空原始变量并使用新数据重新填充,而无需实际执行直接分配,例如:这将改变v指向的原始对象,这将改变以后使用v时看到的数据:
def letgo3(x):
x[:] = np.array([[3,3],[3,3]])
v = np.empty((2, 2))
letgo3(v) # will alter v
请注意,我没有直接向x分配内容;我正在为x的整个内部范围分配一些东西.
如果你绝对必须创建一个全新的对象并让它在外部可见(有时候是pandas的情况),你有两个选择. ‘clean’选项只是返回新对象,例如,
def letgo(df):
df = df.drop('b',axis=1)
return df
a = pd.DataFrame({'a':[1,2], 'b':[3,4]})
a = letgo(a)
另一个选择是到达函数外部并直接更改全局变量.这会将a更改为指向新对象,并且之后引用的任何函数都将看到该新对象:
def letgo():
global a
a = a.drop('b',axis=1)
a = pd.DataFrame({'a':[1,2], 'b':[3,4]})
letgo() # will alter a!
直接改变全局变量通常是一个坏主意,因为任何读取代码的人都很难弄清楚如何改变. (我通常将全局变量用于脚本中许多函数使用的共享参数,但我不允许它们改变那些全局变量.)
内容总结
以上是互联网集市为您收集整理的python pandas dataframe,是值传递还是传递引用全部内容,希望文章能够帮你解决python pandas dataframe,是值传递还是传递引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。