关于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. css font-family属性设置中文字体乱码

    一般设置字体,个人都喜欢用中文,比如:font-family:"微软雅黑":但是偶尔会出现设置以后字体显示乱码的问题 解决方法[1]: 看看你的CSS文件的第一行有没有:@char ...

  2. 初涉Java方法

    初涉Java方法 方法就是一段可重复调用的代码段,方法命名规范,第一个单词小写,从第二个单词开始首字母均大写.         格式:              public static 返回值类型 ...

  3. Git查看远程提交状态的方法

    git使用过程中,经常遇到这样的问题,已经git push 了,但是,由于冲突或者push的分支不对,导致远程的和本地的不一致. 这就需要提交后查看一下远程的是否ok. 查了一下资料,找到了一些方法, ...

  4. 机器学习技法笔记:11 Gradient Boosted Decision Tree

    Roadmap Adaptive Boosted Decision Tree Optimization View of AdaBoost Gradient Boosting Summary of Ag ...

  5. saltstack 初始化LINUX系统

    前面我们已经了解了saltstack的基础功能,现在就可以使用saltstack为初始化新安装的linux系统. 初始化列表: 1.关闭selinux 3.修改sshd配置文件 4.内核优化 5.ul ...

  6. Python常用模块time & datetime &random 模块

    时间模块前言 在Python中,与时间处理有关的模块就包括:time,datetime 一.在Python中,通常有这几种方式来表示时间: 时间戳 格式化的时间字符串 元组(struct_time)共 ...

  7. 为什么(2.55).toFixed(1)等于2.5?

    上次遇到了一个奇怪的问题:JS的(2.55).toFixed(1)输出是2.5,而不是四舍五入的2.6,这是为什么呢? 进一步观察: 发现,并不是所有的都不正常,1.55的四舍五入还是对的,为什么2. ...

  8. linux中一些简便的命令之wc

    wc命令是统计文本中的字符数.单词数以及文本行数的,具体参数如下: -l 统计文本中的行数 -w 统计文本中的单词数 -c/m 统计文本中的字符数 -L 统计文本中最长行的字符数 当然使用时也可以不带 ...

  9. python常用库 - NumPy 和 sklearn入门

    Numpy 和 scikit-learn 都是python常用的第三方库.numpy库可以用来存储和处理大型矩阵,并且在一定程度上弥补了python在运算效率上的不足,正是因为numpy的存在使得py ...

  10. underscore.js源码解析【集合】

    // Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `f ...