理解python函数的参数访问方式

作者: My熊猫眼 | 来源:发表于2019-09-16 23:47 被阅读0次

在《简书》上看到了一个讨论python函数参数传递的文章,仔细读了几遍,有些不是很明白的地方,于是有了此文,欢迎阅读讨论,如有错误,也欢迎指正:

python中"一切皆对象"的概念想必你一定知道;对于python中函数的参数,虽然在函数定义的时候无法指定对象的类型,但是调用该函数的时候,也并不是什么对象都可以传入的,比如我们查看sum的帮助文档,其描述了可接受的第一个参数是可迭代对象(包括迭代器,list,tuple...),第二个参数start,默认值为0,这个参数需要是一个数字;所以参数的传递一定要类型正确

Help on built-in function sum in module builtins:
sum(iterable, start=0, /)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers
    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.

那么函数究竟是如何访问参数的呢?

参数和函数都是对象,函数对象内还包含了函数内部变量,我把这些内部变量理解为“函数内部对象”, 相对于“函数内部对象”,我认为 函数参数 属于”函数需要访问的外部对象“, 这里简称为“外部对象”. 这里从两个纬度讨论:
A. 从函数定义时的参数是否有默认值:
如果指定了默认值,这时候,函数定义完成的时候,建立了两个“外部对象”:其中一个外部对象对应参数的默认值, 这个外部对象一直都存在,但是只有通过函数才可以访问到;而建立的另外一个“外部对象”,是和传递过来的参数值相对应,这个外部对象也是一直存在,但是这个对象的值随着每次调用结束而被释放;
如果函数定义的时候没有指定默认值,那么只是建立第二个“外部对象”;
B. 函数调用时候传递的是否为全局变量:
如果函数调用时候,传递的是全局对象,那么这时候,是不会使用 上面描述的第二个”外部对象“,尽管那个对象存在,但是并不会使用;而是直接使用全局对象;
如果函数调用发生的时候,传递的不是全局对象,那么就会使用上面描述的第二个”外部对象“;
而如果函数调用时,根本没有传递任何的参数(只适用于定义时指定了默认值的情形), 那么会使用上面描述的第一个”外部变量“

下面用一个例子来验证上面的看法:

  1. 无论如何调用,只要没有指定s的值,那么这个对象一直是同一个140276684076680;
  2. 通过把全局对象c 作为参数进行传递,在函数中l 对象(140276683958752)其实就是c 对象(140276683958752);
  3. 无论用[1] 还是[2] 作为参数,对象l 都始终不会变化(140276683988360);
  4. 当没有传递任何参数的时候,l对象始终是:140276684383368
[root@localhost ~]# cat p.py 
#!/usr/bin/env python
def myfunc(l=[],s="hello,china!"):
    print("ID of object l:%d" % id(l))
    print("ID of object s:%d" % id(s))
    l+=["abc"]
    print(l)
c=["global"]   #1
print("ID of object c:%d" % id(c))

print("Using global 'c' as para to call function.")
myfunc(c) 

print("Using '[1]' as para call the function.")
myfunc([1])
print("Using '[2]' as para call the function.")
myfunc([2])

print("Call the func directly without pass para.")
myfunc()
myfunc()
myfunc()
[root@localhost ~]# 

[root@localhost ~]# ./p.py 
ID of object c:140276683958752
Using global 'c' as para to call function.
ID of object l:140276683958752
ID of object s:140276684076680
['global', 'abc']
Using '[1]' as para call the function.
ID of object l:140276683988360
ID of object s:140276684076680
[1, 'abc']
Using '[2]' as para call the function.
ID of object l:140276683988360
ID of object s:140276684076680
[2, 'abc']
Call the func directly without pass para.
ID of object l:140276684383368
ID of object s:140276684076680
['abc']
ID of object l:140276684383368
ID of object s:140276684076680
['abc', 'abc']
ID of object l:140276684383368
ID of object s:140276684076680
['abc', 'abc', 'abc']

本文原创,转载请注明出处

相关文章

  • 理解python函数的参数访问方式

    在《简书》上看到了一个讨论python函数参数传递的文章,仔细读了几遍,有些不是很明白的地方,于是有了此文,欢迎阅...

  • python 参数传递总结

    参数的传递 python中函数的参数通过赋值的方式来传递引用对象。下面总结通过总结常见的函数参数定义方式,来理解参...

  • #javascript#javascript学习

    对函数中参数的理解 在函数体内部可以通过arguments对象知道函数传了几个参数并访问传的参数的值。 如果在函数...

  • JavaScript - function

    函数定义 参数不需要提供类型 函数的三种定义方式 函数可以嵌套 arguments对象:访问函数的实际参数argu...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • Python两个内置函数——locals 和globals

    这两个函数主要提供,基于字典的访问局部和全局变量的方式。 在理解这两个函数时,首先来理解一下python中的名字空...

  • python的参数传递

    一、前言 在python中,函数参数的定义和传递有以下几种方式: 在python中,参数可以按照顺序传递,在调用函...

  • python基础-07-函数

    python基础-函数 1.函数的定义 例子: 2.python中函数的参数详解 必备参数demo: 默认参数de...

  • 在Python中使用静态,类或抽象方法的权威指南

    Python中方法的工作方式 方法是存储在类属性中的函数,你可以用下面这种方式声明和访问一个函数 Python在这...

  • python练习7_@property的使用

    首先理解@property:@property是将python定义的函数"当做"属性来访问,从而提供更加友好的访问...

网友评论

    本文标题:理解python函数的参数访问方式

    本文链接:https://www.haomeiwen.com/subject/eibfuctx.html