关于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. Android开发工程师文集-layout_weight讲解

    前言 大家好,给大家带来Android开发工程师文集-layout_weight讲解的概述,希望你们喜欢 Layout_weight的相关代码展示 <TextView android:layou ...

  2. Ideas

    1.蔬菜店,自带种植的菜地.(实现蔬菜都是新采摘的.) 这个试用于农村,因为需要土地.农村现在蔬菜店大多也是外出进货.有些菜放久了,就坏掉了. 这里有问题就是,(1).如果销量不够,怎么让蔬菜不烂在菜 ...

  3. Vue-Cli 搭建项目 小白

    vue-用Vue-cli从零开始搭建一个Vue项目 Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组 ...

  4. 项目初始化以后出现:Unable to load script from assets 'index.android.bundle

    Mac中真机测试React Native project时出现Unable to load script from assets 'index.android.bundle' 2018年01月21日 ...

  5. odoo开发笔记 -- 升级模块 提示外部ID找不到

    可能的原因: 排查顺序: 1.id在视图中的加载顺序问题. 可能是:__manifest__.py文件,view文件先后加载顺序有问题:也可能是:xml 视图文件中,被引用的id出现在了引用id的下方 ...

  6. Oracle 插入时间时 报错:ORA-01861: 文字与格式字符串不匹配 的解决办法

    一.写sql的方式插入到Oracle中 往oracle中插入时间  '2007-12-28 10:07:24'如果直接按照字符串方式,或者,直接使用to_date('2007-12-28 10:07: ...

  7. 【WebAPI No.5】Core WebAPI中的自定义格式化

    介绍 Web API为JSON和XML提供媒体类型格式化程序.框架默认将这些格式化程序插入管道中.客户端可以在HTTP请求的Accept标头中请求JSON或XML. 格式化数据这个东西,其实没有什么最 ...

  8. 使用git往gitee传数据时pull命令的使用

    按‘i’进入编辑模式------->写入内容------>按Esc键退出-------->在左下角的冒号后面输入‘wq’,表示退出并保存

  9. Haproxy+Heartbeat 高可用集群方案操作记录

    之前详细介绍了haproxy的基础知识点, 下面记录下Haproxy+Heartbeat高可用web集群方案实现过程, 以加深理解. 架构草图如下: 1) 基本环境准备 (centos6.9系统) 1 ...

  10. Kafka的通讯协议

    Kafka的通讯协议 标签:kafka Kafka的Producer.Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议.Kafka的这套协议完全是为了Kafka自身的业务需求 ...