python的pass在函数中的作用_Pass Share:Python / Julia 中函数变量的传递机制

从 C / MATLAB 过来的同学注意!

Julia / Python 中使用的参数传递变量方式是不一样的。(以C的眼光看)在语法上细微的差别就会产生完全不一样的内容。(至少我被坑了很多次)。这篇文章的主要作用是逃坑以及方便各种从不同语言过来的人投奔我们Julia!/狗头

变量的传输方式

对于从 C 和 MATLAB 中转移过来的同学,必须非常注意的一个问题是Julia 中变量的传输机制是Python 党最好跳过这一小节。

此处有两个概念:values:真实的数据

variables: 变量名,在这个语境下我认为这个“名”字非常重要。在编程语言中,用变量名bind(链接)到 values

Pass and share 机制中,在传递的过程中values不会被复制。函数内部中产生了新的变量名。这些变量名

Example 1 & 2

PS: 这两个例子必须连起来看!

y = [1 1]

function f!(z) # there is a "!" mark: see link Tip1 Tip2 below

z[1] = 2 * z[2]

z

# this function return z

end

f!(y)

# 1×2 Array{Int64,2}:

# 2 1

## guess what !!!!!

y

# 1×2 Array{Int64,2}:

# 2 1

这里变量y变化了!C和MATLAB的用户看见会觉得这颠覆了当年我们对于函数穿参的根本守则。

原因是:y作为数组,是mutable(可变的)的。传入的时候,实际上只是用z的refer to 一组数据,即y也refer to 的那一组。当我们去改动z[1],实际上是通过这个z变量名,找到了一组数据的第一个元素,并赋值为等号右面的结果。 所以,当我们用y来访问数据时,自然数据是更改过的。

下面再来看一个例子

y = [1 1]

function g(z) # note that there is no ! here

z = 2*z

z

end

g(y)

# 1×2 Array{Int64,2}:

# 2 2

# guess what!

y

# 1×2 Array{Int64,2}:

# 1 1

这里的y又不变了。这里发生了什么?明明在函数g里,我们也改变了z。 这里似乎又颠覆了刚刚建立的认识。

为了说明到底发生了什么,我们做一个类比,把variables(变量名)比作标签,values(真实的数据)比作物品。变量名就像一个标签贴在了实际的物品(数据)上:传入函数前,我们可以理解为,标签y贴在一组数据value1上,value1的实际数值是[1 1]。

y作为参数传入函数g后,此时只是多生成了一个标签z,同样贴在数据value1上。

z = 2*z的第一步:现在我们通过标签z访问value1,并且根据里面的内容计算2*z也就生成了一组新的数据,我们命名为value2。 这得到了我们右面的运算结果。

z = 2*z的第二步:把标签z挪动位置,贴在value2上。

... (略)

上述的1-4过程进行完了以后,我们就可以看出来分别有value1, value2 对应标签 y, z。y所贴着的数据value1从来没有改变过。因此在此处y又不变了。

Excercise: 为了巩固此处发生了什么,最好用标签物品概念把上一个y改变的例子说明一下,并对比其中的不同。 并且把两个例子串起来重新表述一遍。题外话:这个变化对我来说实际上非常不习惯,我写过很长一段时间的C,后来写过一段时间Python ,这个转换可以说是狠狠坑我了一把,甚至直接导致了我相当不喜欢Python。现在有了一些铺垫,我在 Julia 中已经基本适应了。

有人可能会说,这个机制 Julia 也用,Python 也用为什么你这样吹 Julia 而讨厌 Python 呢,说不定你先用Julia后会喜欢Python。答曰:我依然要吹Julia 。原因如下:1. 文档标注:虽然Julia这一点上面使用了一样的机制,Julia的官方文档在非常显眼的地方是详细的写了这一点的不同(Noteworthy Differences),而且在编程风格中甚至针对这一点进行了强烈的风格建议,以改良你的代码,以防你写和阅读代码的时候忘记了这一点,参阅: Tips 1,Tips 2。(个人偏好,并未引战,只希望用Julia的人如果进入了这个坑,看了我这篇文章能熄灭你的怒火)。2. Julia 真的关心你的代码效率,他是一门跟 C 进行性能比较的语言。

C 用户可能会用“指针”来理解这个过程了。但可能出现一个疑惑了,这样的代码有危险。函数在C和数学中都给人一种“单向性”的感觉:输入只是用来确定输出的东西。输入怎么能够改变呢?C 中如果要完成类似的行为,需要显式传入“指针”。但是在Pass and Share机制下,即使不显式传入,也会把数据暴露在危险当中了!。

我只能承认这确实是我们需要承担这样的风险。(可能关于传入参数这件事情可以有其他的理解方式吗?请知友指教了)所以在Julia 的代码风格(Tips 1)当中(不强制)建议道,当我们的函数有可能改变参数中的mutable变量时,我们需要尊崇convention在函数名中以!结尾,如Example 1。

在本小节最后,必须讲一下如何才能写出一个返回值与上述例子之中f!相同但是不改变输入参数y的函数了,代码如下:使用copy()

function f(w)

z = copy(x)

f!(z)

end

copy函数会生成一个新的数据,是(C的意义下的)真正的复制了一次变量。

实际上这里展示的写法:写一个f!,

再用一个f包装起来,

在一些官方函数中有使用。个人觉得这种写法巧妙的消解了Pass and Share 的机制带来的违和感,非常美妙,保持一种微妙的博弈。如果说你想用Pass and Share 的特性更改输入的参数,那就使用f!,如果你想要更保守一些f。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux启动keepalived服务,llinux企业常用服务---HA+keepalived双机热备

部署前准备:iptables和selinux没配置,关掉挂载系统镜像作为本地yum源,修改yum文件源码包准备keepalived-1.2.13.tar.gz环境介绍:2台centos6.5虚拟机,主服务器ip:192.168.100.150;从服务器ip&…

python 日志不会按照日期分割_python 按照日期切分大日志文件(重点)和按照指定大小切分日志文件...

#! /usr/bin/env python # -*- coding:utf8 -*- # 切分nginx 按照日期切分日志文件 from __future__ import division import os,sys big_file‘/data/logs/media.net.error.log‘ # 按照文件大小拆分 def split_by_filesize(fromfile,todir,chunksize0): """ c…

c++ udp通信_Web 通信协议,你还需要知道:SPDY 和 QUIC

一、开拓者:SPDY1. 简介:spdy 是由google推行的,改进版本的HTTP1.1 (那时候还没有HTTP2)。它基于TCP协议,在HTTP的基础上,结合HTTP1.X的多个痛点进行改进和升级的产物。它的出现使web的加载速度有极大的提高。HTTP2也借…

linux退出windows域,删除Windows AD域控制器的三种方法

一、域控可以正常工作1、删除辅助域控:单击“开始”,单击“运行”,然后键入以下命令:dcpromo /forceremoval然后按提示操作。2、删除主域控:1)打开Active Directory 用户和计算机 ->Domain Controllers,右键点击所要…

查看 rabbitmq 启动websocket 提示404_RabbitMQ 部署记录

erlang与rabbitmq版本对应关系:https://www.rabbitmq.com/which-erlang.html安装erlang下载地址:http://www.erlang.org/downloads11.安装依赖 2yum install -y gcc gcc-c ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term…

react如何卸载组件_reactjs – 如何删除/卸载嵌套的反应组件

是的,你建议的解决方案render: function () {var home this.state.remove_home ? null : return ({home}),handleNavbarClick: function () {this.setState({remove_home: true});}或多或少是使用React处理此问题的“正确”方法.请记住,渲染的目的是描述组件在任何给定点上的…

linux远程windows执行cmd,Linux服务器远程连接window服务器并执行cmd命令

前段时间,要给一个分布式调度系统写一个运维脚本,这个分布式调度系统部分子系统部署在window服务器上,这个时候就要想办法用Linux远程来连接window服务器,并执行cmd命令。下面是我的解决方法:1、在Linux服务器上的处理…

python函数式编程读取数据时出现错误_Python编程中,函数遇到问题是抛出错误好还是约定返回值好?...

这其实是一个编码规范的问题,没有任何场景都适用的解决方案,就好比有了 list,但是还是需要 tuple,所以对于抛出异常好,还是返回值好,是需要具体情况看的。 在 C 语言中,通用的做法是函数返回一个…

access中如何画斜线_设计斜线表头

。1.4.16 在表格顶端加空行要在表格顶端加一个非表格的空白行,可以使用“CtrlShiftEnter”组合键通过拆分表格来完成。但当你的表格位于文档的最顶端时,有一个更为简捷的方法,就是先把插入点移到表格的第一行的第一个单元格的最前面&#xff…

Linux安装Flash脚本,Linux(CentOS)下的Shockwave Flash shell一键更新脚本

原创内容,转载请注明出处: https://www.myzhenai.com.cn/post/2318.html https://www.myzhenai.com/thread-17933-1-1.html关键字: Shockwave Flash一键更新脚本 Flash一键更新脚本这个脚本其实是我自己用的, 我的系统里安装了FlashPlayer软件和火狐(firefox)浏览器里安装了Sho…

收文处理和发文处理的环节_集气罩的设计是气体净化、废气处理系统设计的重要环节...

在工业生产中,常用于控制各种颗粒物和气态污染物的方法是将有害物质在发生源收集起来,经过净化设备净化后排到大气中,这就是局部排气净化系统,这种系统所需要的风量最小,效果好,能耗也少,是生产…

linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)

简单来说就是:PV:是物理的磁盘分区VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘LV:也就是从VG中划分的逻辑分区如下图所示PV、VG、LV三者关系&…

cad监控图标_干货!多种不同环境的无线视频监控系统拓扑图

有人问,既然无线视频监控系统如此普及,是不是所有地方都能用到无线视频监控设备呢?例如在大街上、学校里,工厂中、写字楼内,建筑工地上、公园中、住宅小区里、江河岸边、港口码头、甚至是森林、戈壁滩等等。只要有需要…

linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册

明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册[复制链接]编译主机环境编译主机CPU架构:64位编译主机系统:LinuxLinux发行版:UbuntuUbuntu版本号:14.04.5Ubuntu版本类型:桌面版Ubuntu系统类型:x86-64安装 SD…

axios 获取上传进度_PHP获取HTTP body内容的方法总结

有时候我们获取数据时需要根据Header中的格式来解析,比如上传一个json而不是一个文本。这里用到了 php输入|输出流 的概念。PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时…

python编程快速上手 让繁琐工作自动化 豆瓣_2019年,这些豆瓣评分9.0以上的8本程序员好书你都知道吗?...

豆瓣这些9.0以上的高评分程序员好书你都知道有哪些吗?小编去豆瓣看了一下,推荐这8本最适用的程序员好书给你。 1、UNIX环境高级编程(第3版)(豆瓣评分9.6)UNIX编程圣经 与…

hadoop集群swap_hadoop集群调优-OS和文件系统部分

OS and File System根据Dell(因为我们的硬件采用dell的方案)关于hadoop调优的相关说明,改变几个Linux的默认设置,Hadoop的性能能够增长大概15%。open file descriptors and files文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打…

python搭建selenium_自动化测试之路3-selenium3+python3环境搭建

1、首先安装火狐浏览器 有单独文章分享怎么安装 2、搭建python环境 安装python,安装的时候把path选好,就不用自己在配置,安装方法有单独文档分享 安装好以后cmd打开输入python查看是否配置好 3、安装pip 一般python会默认带一个,放…

linux perl的while循环中ctrl+c失效,perl循环控制

if格式(类似于awk):if(表达式){ #空格可以忽略语句 ;} #elsif注意多了个s,elsif和else可以省略elsif(表达式){ #语句块的{}必须有,可以为空语句:}else{语句&#xff1…

keras实现简单lstm_深度学习(LSTM)在交通建模中的应用

上方点击蓝字关注?在简单了解了LSTM原理之后,本期我将以航班延误预测为例为大家介绍一下如何利用Python编程来构建LSTM模型。这里我们要用到一个高级的深度学习链接库——Keras,它以TensorFlow或者Theano作为后端引擎,只处理模型的建立、训练和预测等功…