问 题

void swap(int *p1, int *p2){

int temp; //临时变量

temp = *p1;

*p1 = *p2;

*p2 = temp;

}

int main(){

int a = 66, b = 99;

swap(&a, &b);

printf("a = %d, b = %d\n", a, b);

return 0;

}

如上是C语言的实现,我想用python也做这么一个,要求修改的外部变量是可以用参数传递的

不要这样:

a1 = 80

b1 = 90

def func():

global a1, b1 #若不是用a1, b1就不行了

temp = a1

a1 = b1

b1 = temp

return a1, b1

这样也不行,直接赋值了,如下

str = 'aaa'

def add(str):

str += 'b'

return str

str = add(str) #这步赋值了

print str

希望这个函数是类似C的,可以通过传参数来修改外部变量,不知道怎么写啊,是不是就不可以这样,还是我理解的不够。

忘记说了,参数不要是列表,列表可以在原处修改

解决方案

简而言之,Python是不允许选择值传递还是引用传递的,如果参数是immutable的,那么传递就是“值传递”(复制值),如果是mutable的,那么传递就是“引用传递”。但是哪怕是“引用传递”,引用本身(也就是相当于指针)是“值传递”的,因此你想要的效果应该是无法达到的。

事实上Python是没有值/引用传递的概念的,传递的都是对象本身。代码中的a、b变量也只是储存着对对象的引用。关于Python引用传递可以参见stackoverflow

除了无法实现以外,这样的操作是很不pythonic的,反而我觉得函数操作对象后返回对象本身(你描述的第二种方法)是很不错的,这样可以进行链式编程(例如a.func1().func2().func3())。python有gc,所以不用过于担心内存问题。

要达到类似效果的话有下面两种方法:

由于传入函数的参数是可以进行in-place的变化的,因此你可以把对象封装成引用再传入函数(类似与C#的装箱操作)。具体方法可以使用dict/list/etc.:

data = dict()

data['a']=80

data['b']=90

def func(data):

data['a'], data['b'] = data['b'], data['a']

或者自行写一个wrapper,重载一下__getattr__方便访问。

如果你实在想通过奇淫技巧实现swap的话可以操作python的引用访问,参见这篇blog(极其不推荐)

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

python函数内部变量能改变外部吗_python中,如何利用函数修改外部变量,注意我的要求...相关推荐

  1. delphi中的函数传参如何传枚举参数_Python基础笔记Day05函数

    Python函数 function 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但 ...

  2. R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归

    R语言广义线性模型函数GLM.glm函数构建逻辑回归模型(Logistic regression).R中有几种logistic回归扩展和变异.robust包中的glmRob函数鲁棒logistic回归 ...

  3. Excel中如何利用函数验证身份证号码是否正确?

    今天小编跟大家分享一下Excel中如何利用函数验证身份证号码录入是否正确? ​ 1.首先打开Excel文件,然后选中身份证号码单元格区域 2.然后找到并鼠标单击[DIY工具箱]选项 3.点击[身份证] ...

  4. c语言中函数形参值改变了,相应的实参值是否改变,C语言中,如何利用函数和指针变量通过形参变量的值改变实参变量的值...

    必备知识:c语言中的函数调用和指针变量的相关知识 众所周知,函数是C语言中一个十分重要的模块,因为函数的存在,使得C语言的可读性.可维护性.可移植性大大提高.因此,想要学好C语言,必须要学好函数.函数 ...

  5. python的作用域分别有几种_python中作用域与函数嵌套

    知识回顾: 拆解传参. 1.字典传参.使用** 2.列表传参.使用* 实际上我们在定义函数的时候,如果省略了星号,那么在调用函数的时候必须要省略星号,除非我们拆解后的参数个数刚好相等. 视频内容 本节 ...

  6. python代码风格程序越复杂越高级_Python中代码风格的改变和相应的性能优化

    使用现代风格改善你的代码 一旦你开始使用 Python 3,你就有机会接触新的特性来改善你的代码.这篇文章中提到的很多东西实际上在 Python 3 之前就已经被支持了.但我还是要提一下它们,因为知道 ...

  7. python 一等公民_Python中一等公民——函数

    Python中"一等公民"--函数 Python的函数是"一等公民". 你可以将它们分配给变量,将它们存储在数据结构中,将它们作为参数传递给其他函数,甚至将它们 ...

  8. python函数isdisjoint方法_Python中的isdisjoint()函数

    在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到任何元素,则返回False,否则返回True. 除了设置输入 ...

  9. [转载] python函数isdisjoint方法_Python中的isdisjoint()函数

    参考链接: Python Set isdisjoint() 在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到 ...

最新文章

  1. 分布式为什么一定要有高可用的分布式锁?一线大厂必看!
  2. 向MySQL数据库中插入数据,sql语句没问题,但插入失败也不报错?
  3. 跟我一起学.NetCore之日志(Log)模型核心
  4. Web服务器 - Apache配置介绍
  5. Linux 命令之 iostat 命令-监视系统输入输出设备和 cpu 的使用情况
  6. 注意,SVN提交代码时,会遗漏so库
  7. java源代码解除断点_此断点目前不会被命中,源代码与原始代码不同(即使在清理/重建后)...
  8. 这五大基础原理,总是牛逼的无话可说
  9. WPF——自定义日历
  10. 侯晓迪:全身心的投入,吃住都在实验室
  11. 最全的Windows10强制永久关闭自动更新方法!
  12. JAVA访问控制权限
  13. 用python画漂亮的网状几何图形
  14. beeline连接失败 No current connection
  15. 软件测试工程师简历项目经验怎么写?--1000个已成功入职的软件测试工程师简历范文模板(真实简历)
  16. 敲击键盘后字符怎么出现在显示器
  17. 面试必问——jvm原理及优化(包括GC)
  18. linux解压zip覆盖目录,linux下压缩与解压(zip、unzip、tar)详解
  19. 移动硬盘出现“位置不可用无法访问,磁盘结构损坏且无法读取”的解决方法
  20. SEAL开源库源码12

热门文章

  1. ubuntu开机启动管理
  2. Python调用C/C++的种种方法
  3. 自动化运维——一键安装MySQL
  4. c++版 mulSpectrums
  5. vlc延时处理-跳帧
  6. java 远程登陆windows_使用Windows身份验证,JAVA连接到远程MSSQL
  7. c多线程并发处理方式_ElasticSearch 并发的处理方式:锁和版本控制
  8. java 线性表排序_Java线性表的排序
  9. 附加 集合数据_最全的实例详解:Python字符串、列表、元组、字典、集合的补充...
  10. qtplaintextedit如何删除内容_(mac常见问题)如何删除 Mac 储存空间的其他选项?...