Python 关于Python函数参数传递方式的一点探索
关于Python函数参数传递方式的一点探索
by:授客 QQ:1033553122
实践代码
#!/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函数参数传递方式的一点探索的更多相关文章
- python中的函数参数的传递
转载自: http://winterttr.me/2015/10/24/python-passing-arguments-as-value-or-reference/ 我想,这个标题或许是很多初学者的 ...
- Python进阶(二)----函数参数,作用域
Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...
- Python学习笔记 - 函数参数
>>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...
- python学习day10 函数Ⅱ(参数&作用域)
函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...
- python基础之函数参数,名称空间,以及函数嵌套
函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...
- Python学习之函数参数
上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...
- python基础之函数参数、嵌套、返回值、对象、命名空间和作用域
函数的使用原则 函数的使用必须遵循:先定义后使用的原则 函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用就相当于在引用一个不存在变量名 定义阶段:只检测语法,不执行代码,当出现语法错误 ...
- Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏
转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. ...
- Java函数参数传递方式详解
在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简 ...
随机推荐
- Java学习笔记53(网络编程:TCP协议案例)
简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.Outp ...
- Win10 Hyper-v下虚拟机使用无线网络
首先要承认一点的是写这个随笔更大的初衷是想吐槽,搜了半天,全是一种方法,就是创建一个新的网络适配器,配置为外部网络啥啥啥,用倒是能用,就是网速那叫一个感人,我的是电信百兆光纤网页打开都如蜗牛爬,无法忍 ...
- LeetCode--No.010 Regular Expression Matching
10. Regular Expression Matching Total Accepted: 89193 Total Submissions: 395441 Difficulty: Hard Imp ...
- java开发,年薪15W的你和年薪50W的他的差距
在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase.Hadoop.MQ.Netty.SpringCloud等等 . 一些独角 ...
- Centos 7 Asp.net core 使用QRCoder 报“Unable to load DLL 'gdiplus'"
环境: Centos7 .Net core 2.0 问题: 使用QRCoder 报“Unable to load DLL 'gdiplus'" 同 https://q.cnblogs.com ...
- SQL Server性能优化(10)非聚集索引的存储结构
一,新建测试表 CREATE TABLE [dbo].[Users]( ,) NOT NULL, ) NOT NULL, [CreatTime] [datetime] NOT NULL ) ON [P ...
- 高可用Hadoop平台-Oozie工作流之Hadoop调度
1.概述 在<高可用Hadoop平台-Oozie工作流>一篇中,给大家分享了如何去单一的集成Oozie这样一个插件.今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已 ...
- transformer 源码
训练时: 1. 输入正确标签一次性解码出来 预测时: 1. 第一次输入1个词,解码出一个词 第二次输入第一次输入的词和第一次解码出来词一起,解码出来第3个词,这样依次解码,解码到最长的长度或者< ...
- 西门子PLC-1200 SCL语言开发学习笔记 (一)
一.简介和背景 PLC一般使用梯形图开发,但是梯形图适合电工使用而不是程序员使用,对我们来说开发困难,门槛高,幸好PLC的开发标准还带了类pascal的高级语言,在西门子这里叫SCL语言,这对于我们程 ...
- mysql优化的21条经验(转)
1. 为查询缓存优化你的查询大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个 ...