关于Python函数参数传递方式的一点探索

by:授客 QQ1033553122

实践代码

#!/usr/bin/env python

# -*- coding:utf-8 -*-

__author__ = 'laifuyu'

 

 

def function1(int_obj, float_obj, str_obj, boolean_obj, list_obj, tuple_obj, set_obj, dict_obj):

print('\nvalue of args of function1: ')

print('int_obj:  %s id:%s' % (int_obj, id(int_obj)))

print('float_obj:  %s id:%s' % (float_obj, id(float_obj)))

print('str_obj:  %s id:%s' % (str_obj, id(str_obj)))

print('boolean_obj:  %s id:%s' % (boolean_obj, id(boolean_obj)))

print('list_obj:  %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj:  ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj:  %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj:  %s id: %s' % (dict_obj, id(dict_obj)))

int_obj = 8

float_obj = 9.0

str_obj = 'ishouke'

    boolean_obj = True

    list_obj = ['i', 'shou', 'ke']

tuple_obj = ('shou', 'ke', '2014')

set_obj = {'shouke', '2014'}

dict_obj = {'time':2014, 'author':'shouke'}

print('\nvalue of obj after value changed in function1: ')

print('int_obj:  %s id:%s' % (int_obj, id(int_obj)))

print('float_obj:  %s id:%s' % (float_obj, id(float_obj)))

print('str_obj:  %s id:%s' % (str_obj, id(str_obj)))

print('boolean_obj:  %s id:%s' % (boolean_obj, id(boolean_obj)))

print('list_obj:  %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj:  ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj:  %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj:  %s id: %s' % (dict_obj, id(dict_obj)))

def function2(list_obj, tuple_obj, set_obj, dic_obj):

list_obj[2] = '2014'

    tuple_obj[2][0] = '2016'

    set_obj.add('2014')

dict_obj['time'] = 2014

print('\nvalue of obj after value changed in function2: ')

print('list_obj:  %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj:  ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj:  %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj:  %s id: %s' % (dict_obj, id(dict_obj)))

if __name__ == '__main__':

int_obj = 6

float_obj = 7.0

str_obj = 'shouke'

    boolean_obj = False

    list_obj = ['shou', 'ke', 'python']

tuple_obj = ('shou', 'ke', ['2014'])

set_obj = {'i', 'shouke'}

dict_obj = {'time':2016, 'author':'ishouke'}

print('value of obj in main before function1 called: ')

print('int_obj:  %s id:%s' % (int_obj, id(int_obj)))

print('float_obj:  %s id:%s' % (float_obj, id(float_obj)))

print('str_obj:  %s id:%s' % (str_obj, id(str_obj)))

print('boolean_obj:  %s id:%s' % (boolean_obj, id(boolean_obj)))

print('list_obj:  %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj:  ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj:  %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj:  %s id: %s' % (dict_obj, id(dict_obj)))

function1(int_obj, float_obj, str_obj, boolean_obj, list_obj, tuple_obj, set_obj, dict_obj)

print('\nvalue of obj in main after function1 called: ')

print('int_obj: %s id:%s' % (int_obj, id(int_obj)))

print('float_obj: %s id:%s' % (float_obj, id(float_obj)))

print('str_obj: %s id:%s' % (str_obj, id(str_obj)))

print('boolean_obj: %s id:%s' % (boolean_obj, id(boolean_obj)))

print('list_obj: %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj: ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj: %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj: %s id: %s' % (dict_obj, id(dict_obj)))

function2(list_obj, tuple_obj, set_obj, dict_obj)

print('\nvalue of obj in main after function2 called: ')

print('list_obj: %s id:%s' % (list_obj, id(list_obj)))

print('tuple_obj: ',tuple_obj, ' id: ', id(tuple_obj))

print('set_obj: %s id: %s' % (set_obj, id(set_obj)))

print('dict_obj: %s id: %s' % (dict_obj, id(dict_obj)))

输出结果

说明:比较main中,function1中接收的对象参数的值,id,不难发现:python中参数传递都是按“引用”传递,而非按“值”传递。



说明:对比,main,function1中参数对象被修改前,修改后的值,id,不难发现:当执行
var_name = value
语句时,实际把一个新的对象,赋值给左侧的
var_name变量,,赋值后
id(var_name) = id(value),,更加有力的说明python中一切皆对象。

说明:对比main,function2中参数对象被修改前,修改后的值,不难发现:当仅修改可变对象的组成项的值时,而不是直接对整个对象赋值的情况下,修改的是本对象自身。

Python 关于Python函数参数传递方式的一点探索的更多相关文章

  1. python中的函数参数的传递

    转载自: http://winterttr.me/2015/10/24/python-passing-arguments-as-value-or-reference/ 我想,这个标题或许是很多初学者的 ...

  2. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

  3. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  4. python学习day10 函数Ⅱ(参数&作用域)

    函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...

  5. python基础之函数参数,名称空间,以及函数嵌套

    函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...

  6. Python学习之函数参数

    上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...

  7. python基础之函数参数、嵌套、返回值、对象、命名空间和作用域

    函数的使用原则 函数的使用必须遵循:先定义后使用的原则 函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用就相当于在引用一个不存在变量名 定义阶段:只检测语法,不执行代码,当出现语法错误 ...

  8. Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏

    转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式:  A. 是按值传递的?  B. ...

  9. Java函数参数传递方式详解

    在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简 ...

随机推荐

  1. 可变码率(英语:Variable bitrate,简称VBR)介绍

    可变码率(英语:Variable bitrate,简称VBR)这是一个用来形容通信服务质量(QoS for Quality of Service)的术语.和该词相对应的词是固定码率或固定比特率,英文c ...

  2. Liferay7 BPM门户开发之24: Liferay7应用程序安全

    整理中...... Resources, Roles, and PermissionsPortal Access Control List (PACL) Custom SSO Providers Au ...

  3. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  4. Java 基础学习总结(一)抽象类和接口

    接触java的时间不是很长,以前对抽象类和接口的定义和区别也是模糊不清,最近拿起学校的教程读了起来,也参阅了网上的博客大神理解和总结,于是决定自己按照自己的理解来总结一下. 抽象类(半成品)   一般 ...

  5. Linux学习笔记之二————Linux系统的文件和目录

    一.Windows和Linux文件系统区别 1.在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示:  ...

  6. JConsole观察分析Java程序的运行状态

    Java 自带性能监控工具:监视和管理控制台 jconsole,它可以提供 Java 某个进程的内存.线程.类加载.jvm 概要以及 MBean 等的实时信息. 通过Java SE Developme ...

  7. Android Systom

  8. Hadoop2源码分析-HDFS核心模块分析

    1.概述 这篇博客接着<Hadoop2源码分析-RPC机制初识>来讲述,前面我们对MapReduce.序列化.RPC进行了分析和探索,对Hadoop V2的这些模块都有了大致的了解,通过对 ...

  9. zabbix 自定义监控项简单案例

    例如:获取被监控主机的登录用户数 以uptime为例: 输入命令:uptime | awk '{print $6}'  可以获得当前登录用户数(不通终端打印出的位置不同) 1.被监控主机修改zabbi ...

  10. zabbix 监控基础

    一.监控系统基础概念 1.监控系统的工作内容 数据采集 --> 数据存储 --> 数据展示 --> 报警 传感器    时间序列数据    趋势图  采集到的数据超出阈(yu)值 2 ...