不可变对象(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的函数调用和参数传递的更多相关文章

  1. Python中函数的参数传递与可变长参数

    转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

  2. Python 函数定义以及参数传递

    Python 函数定义以及参数传递1.函数定义#形如def func(args...): doSomething123以关键字def 开头,后面是函数名和参数下面是函数处理过程. 举例: def ad ...

  3. python关于函数调用作为参数的说明&&装饰器

    python关于函数调用作为参数的说明&&装饰器 简单的: 先看代码: def out(): print('out') def inner(): return 'inner' retu ...

  4. python中的*和**参数传递机制

    python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...

  5. Python的特有的参数传递(*和**)

    目录 值传递 引用传递 python的传递方式具有两种值传递和引用传递.除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础: 值传递 int.float ...

  6. Linux Debugging(三): C++函数调用的参数传递方法总结(通过gdb+反汇编)

    上一篇文章<Linux Debugging:使用反汇编理解C++程序函数调用栈>没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特 ...

  7. Python引用复制,参数传递,弱引用与垃圾回收

    引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产 ...

  8. Python设置函数调用超时

    http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景:        最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够 ...

  9. python是如何进行参数传递的?

    在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递. python变量以及赋值 数值 从几行代码开始 In [1]: ...

随机推荐

  1. 三、线程同步之Sysnchronized关键字

    线程同步 问题引入 观察一面一段小程序: public class Main { private static int amount = 0; public static void main(Stri ...

  2. ubantu16.04+mxnet +opencv+cuda8.0 环境搭建

    ubantu16.04+mxnet +opencv+cuda8.0 环境搭建 建议:环境搭建完成之后,不要更新系统(内核) 转载请注明出处: 微微苏荷 一 我的安装环境 系统:ubuntu16.04 ...

  3. Linux deepin 下sublimes配置g++ openGL

    参考 :http://blog.csdn.net/u010129448/article/details/47754623 ubuntu 下gnome只要将代码中deepin-terminal改为gno ...

  4. vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!

    现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...

  5. Swift 圆角设置

    故事面板中设置圆角(storyboard) Key Path layer.borderWidth(边框宽度) layer.cornerRadius(圆角弧度) layer.borderColor(边框 ...

  6. Spring的JDBC模板

    Spring对持久层技术支持 JDBC : org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 : org.springframework. ...

  7. 车销宝无线开单PDA 一款互联网+POS神器 无缝与电脑数据同步 无线POS开单解决方案

    1.无线POS开单解决方案是基于后台系统开发的一套系统,它实现了采购入库退货.销售出库退货.盘点调拨等功能. 2.系统通过(WIFI.GPRS.GSM.蓝牙)实时后台库存.客户.商品.价格跟踪等信息, ...

  8. 根据oracle的主键列生成SQLserver的主键

    根据oracle的主键列生成MsSQLServer的主键列 select 'alter table  ' || cu.table_name ||'  add constraint  '||' PK_' ...

  9. js中获取css的样式

    因为给定一个div宽度或者其他样式之后,再设置一个border的宽度在js中得到的obj.setoffWidth就会变成width加上border的二倍宽度,因此可以自己写一个方法来获取样式.(obj ...

  10. 闲来无事,写个基于UDP协议的Socket通讯Demo

    项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...