十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。
成都创新互联公司是一家专业提供凭祥企业网站建设,专注与成都网站制作、成都做网站、H5网站设计、小程序制作等业务。10年已为凭祥众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。
对于你的代码:
执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。
执行函数add(d)过程中:
d被传递给add()函数后,在函数内部,num也指向了__main__中的2
但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。
如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变。因此,你打印d时得到了2。
如果你想让输出为12,最简洁的办法是:
在函数add()里增加return num
调用函数时使用d = add(d)
代码如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d
和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。
Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用id()来查询内存地址
如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。
1. 函数赋值只是把函数名赋值给变量,并不是执行函数,有无返回值都可以;
例如:a = function
2. 如果把调用函数赋值给变量,才是函数返回值赋值给变量;
如果没有返回值,赋值变量的值为None;
例如 a = function( params )
意思是python中所有变量包括函数名都是一个对象,可以任意赋值
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}