关于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. Nginx 负载均衡与反向代理

    通过设置权重来轮询 weight server 192.168.1.62  weight=5 server 192.168.63 weight=1 ip_hash 第3方均衡策略 fair url_h ...

  2. jsp和servlet的关系

    JSP是Servlet技术的扩展,本质上就是Servlet的简易方式.JSP编译后是“类servlet”. Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完 ...

  3. Python网络编程-IO阻塞与非阻塞及多路复用

    前言 问题:普通套接字实现的服务端的缺陷 一次只能服务一个客户端!                         accept阻塞! 在没有新的套接字来之前,不能处理已经建立连接的套接字的请求 re ...

  4. vue-cli3.0 升级记录

    年三十时 vue2.6 发布,向 3.0 看齐,说明 3.0 不远了.作为开发者也应该为vue3.0 做点准备.首先是把 vue-cli 升级到 3.x ,在这记录下 vue-cli2.x 升级 vu ...

  5. [P4921] 情侣?给我烧了!

    回顾一下错排公式 错排问题: 设n位错排数为D[n].考虑元素1的位置,设置为k(有n-1中 ):在考虑元素k的位置, 若为1,则转换为n-2位的错排:否则,视元素k为元素1(不能放在位置1),转换为 ...

  6. 配置 Nginx 的目录浏览功能

    Nginx 默认是不允许列出整个目录的,需要配置 Nginx 自带的 ngx_http_autoindex_module 模块实现目录浏览功能 . location / { alias /opt/fi ...

  7. wxformbuilder在python如何使用

    1使用builder 创建界面并进行布局 2选择python选项 得到相应代码 将代码保存在 一个py文件里面 创建一个新的入口文件 main.py import wx import UIfile c ...

  8. Java:类与对象概念

      什么是类? 怎样定义一个类? 什么是对象,类和对象之间是什么关系,怎样创建一个对象? 对象引用和对象在内存中是如何分配的? 什么是类? 1. 类是具有相同的属性和功能的事物的抽象的集合,在面向对象 ...

  9. 如何才能够系统地学习Java并发技术?

    微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...

  10. Django集成Markdown编辑器【附源码】

    专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m ...