python的函数调用和参数传递
不可变对象(immutable):int、string、float、number、tuple
可变对象(mutable):dict、list
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)
但是对于list来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而印象原有变量。(我们称此为指针传递)
如何定义函数?
- 以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
关于不可变对象类型的函数定义、调用和传参:
# -*- coding:utf-8 -*- a = 1 def change_a_1(a):
a += 1
print a
return a def change_a_2(a):
a += 1
print a print a
print change_a_1(a)
print a
a = change_a_1(a)
print a
a = change_a_2(a)
print a
最终打印出来的结果有几个?又分别是什么?主要涉及三个知识点,函数的定义、函数的调用以及传参,一旦弄清楚了,就很容易回答这个问题了。
函数的定义:
a = 1 def change_a_1(a):
a += 1
print a
return a def change_a_2(a):
a += 1
print a
函数的调用:
print change_a_1(a)
print a
注意:函数的定义与函数的执行,是两个过程。定义的函数如果不调用是不会执行的!
所以说,最终的打印结果和返回结果如下:
print a #1
print change_a_1(a) #2(函数return的返回值),2(函数内部的打印结果)
print a #1
a = change_a_1(a)
print a #2,2
a = change_a_2(a)
print a #3(函数内部一次),None(最终打印结果)
关于全局变量和局部变量:
如果函数内任意地方有赋值,那么这个被解释为局部变量;
如果函数内没有赋值,函数之前有赋值,那么将被解释为全局变量。
def change_a_3(a):
a = 6
a += 1
print a
return a a = 2
print change_a_3(a) #7,7
print a #2
a = change_a_3(a)
print a #7,7
关于可变对象类型的函数定义、调用和传参:
b = [1, 2, 3, 4] def change_b(b):
b = b[1]
print b
return b def change_b_1(b):
b.append(13)
print b
return b def change_b_2(b):
b = [9, 7, 6, 6, 4]
b.append(13)
print b
return b print b #[1,2,3,4]
b.pop(1)
print b #[2,3,4]
print change_b(b) #3,3
print b #[2,3,4]
b = change_b(b)
print b #3,3 b = [1, 2, 3, 4]
print change_b_1(b) #[1,2,3,4,13],[1,2,3,4,13]
print change_b_1(b) #[1,2,3,4,13,13],[1,2,3,4,13,13]
print change_b_2(b) #[9,7,6,6,4,13]
print change_b_2(b) #[9,7,6,6,4,13]
1.当函数的传入参数代表唯一的值,也就是像int这种内部无法改变的,外部的变量是无法修改的。对同名的外部变量赋值,也无法改变外部变量的值。
2.当函数传入参数是像list,dict,类对象这样代表一个集合的话,可以对传入参数的内部做修改,引起外部变量值的变化。但是对同名的外部变量直接赋值,是不会改变外部变量的结果的。
python的函数调用和参数传递的更多相关文章
- Python中函数的参数传递与可变长参数
转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...
- Python 函数定义以及参数传递
Python 函数定义以及参数传递1.函数定义#形如def func(args...): doSomething123以关键字def 开头,后面是函数名和参数下面是函数处理过程. 举例: def ad ...
- python关于函数调用作为参数的说明&&装饰器
python关于函数调用作为参数的说明&&装饰器 简单的: 先看代码: def out(): print('out') def inner(): return 'inner' retu ...
- python中的*和**参数传递机制
python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...
- Python的特有的参数传递(*和**)
目录 值传递 引用传递 python的传递方式具有两种值传递和引用传递.除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础: 值传递 int.float ...
- Linux Debugging(三): C++函数调用的参数传递方法总结(通过gdb+反汇编)
上一篇文章<Linux Debugging:使用反汇编理解C++程序函数调用栈>没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特 ...
- Python引用复制,参数传递,弱引用与垃圾回收
引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产 ...
- Python设置函数调用超时
http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够 ...
- python是如何进行参数传递的?
在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递. python变量以及赋值 数值 从几行代码开始 In [1]: ...
随机推荐
- webuploader在IE8/9下上传遇到的两个问题
最近在做图片上传功能. 点击一个按钮,弹出一个iframe,它是百度的webuploader插件 在点击关闭按钮时,IE9下总是会报错: __flash__removeCallback未定义错误 解决 ...
- NoSQL与RDBMS的九点区别联系
原文链接:http://blog.sina.com.cn/s/blog_5373fb0b0101ft8a.html 1 理解ACID与BASE的区别(ACID是关系型数据库强一致性的四个要求, ...
- 手把手教你玩转nginx负载均衡(四)--源码安装nginx
引言: 在上一篇,我们已经装好了虚拟机,并且已经配置好了网络,那么今天我们就要开始安装nginx服务器了. 安装工具以及过程 安装gcc编译套件以及nginx依赖模块 yum -y install g ...
- teamviewer "TeamViewer Daemon is not running
执行下面的命令问题解决: # teamviewer --daemon enable enable Sat Jan :: CST Action: Installing daemon () for 'up ...
- javascript面向切面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++预定义宏
C/C++宏体中出现的#,#@,##: - #的功能是将其后面的宏参数进行字符串化操作(stringfication),就是对它所引用的宏变量通过替换后在其左右各加上一个双引号 -##被称为连接符(c ...
- Matlab 读取文件夹中所有的bmp文件
将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...
- Python os模块介绍
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curd ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- SQLServer2005如何批量修改架构名 - wuxiaokaixinguo的专栏
原文地址:http://blog.csdn.net/wuxiaokaixinguo/article/details/8523093 ) BEGIN SET @name='原构架名.' + @name ...