龙空技术网

黄哥Python: Python 函数参数传引用还是传值?

跟黄哥学编程 569

前言:

现在姐妹们对“python中引入函数”可能比较注意,看官们都需要学习一些“python中引入函数”的相关文章。那么小编同时在网络上收集了一些有关“python中引入函数””的相关文章,希望兄弟们能喜欢,兄弟们快快来了解一下吧!

本文由黄哥写于多年前,再次分享出来。2020-3-20日更新成Python3 代码

Python程序中存储的所有数据都是对象,每一个对象有一个身份,一个类型和一个值。

看变量的实际作用,执行a = 8 这行代码时,就会创建一个值为8的int对象。

变量名是对这个"一个值为8的int对象"的引用。(也可以简称a绑定到8这个对象)

1、可以通过id()来取得对象的身份

这个内置函数,它的参数是a这个变量名,这个函数返回的值

是这个变量a引用的那个"一个值为8的int对象"的内存地址。

   >>> a = 8   >>> id(8)   4298180944   >>> help(id)   Help on built-in function id in module builtins:id(obj, /)    Return the identity of an object.    This is guaranteed to be unique among simultaneously existing objects.    (CPython uses the object's memory address.)

2、可以通过type()来取得a引用对象的数据类型

       >>> a = 8       >>> id(8)       4298180944       >>> type(a)       <class 'int'>

3、对象的值

当变量出现在表达式中,它会被它引用的对象的值替代。

总结:类型是属于对象,而不是变量。变量只是对对象的一个引用。

对象有可变对象和不可变对象之分。

Python函数传递参数到底是传值还是引用?

传值、引用这个是c/c++中的概念,Python中一切都是对象,

实参向形参传递的是对象的引用值。就像Python赋值的意思。

请看代码

# coding:utf-8def foo(a):   print(f"传来是对象的引用 对象地址为{id(a)}")   a = 3 #形式参数a是局部变量、a重新绑定到3这个对象。   print("变量a新引用对象地址为{0}".format(id(a)))   print(a)x = 5print("全局变量x引用的对象地址为{0}".format(id(x)))foo(x)print(x)#由于函数内部a绑定到新的对象,也就修改不了全部变量x引用的对象5#全局变量x引用的对象地址为4298181192#传来是对象的引用 对象地址为4298181192#变量a新引用对象地址为4298181240#3#5# coding:utf-8def foo(a):   """在函数内部直接修改了同一个引用指向的对象。   也就修改了实际参数传来的引用值指向的对象。   """   a.append("can change object")   return alst = [1,2,3]print(foo(lst))print(lst)#[1, 2, 3, 'can change object']#[1, 2, 3, 'can change object']# coding:utf-8def foo(a):   """实际参数传来一个对象[1,2,3]的引用,当时形式参数(局部变量a   重新引用到新的对象,也就是说保存了新的对象)   当然不能修改原来的对象了。   """   a = ["黄哥Python培训","黄哥"]   return alst = [1,2,3]for item in foo(lst):   print(item)print(lst)

总结:Python函数传递的是对象的引用值,非传值或传引用。

但是如果对象是不可变的,感觉和c语言中传值差不多。

如果对象是可变的,感觉和c语言中传引用差不多。

标签: #python中引入函数