Python之函数与变量(7)

So, 答案已经有了,name1并没有被改变,因此输出结果是:

name1: Tom name2: Jerry 示例2: num1 = 10 num2 = num1 num2 += 1 print('num1: %d' % num1) print('num2: %d' % num2)

与示例1过程相似,只是+=操作也是一个赋值的过程,其他不再做过多解释。
输出结果:

num1: 10 num2: 11 示例3: list1 = ['Tom', 'Jerry', 'Peter', 'Lily'] list2 = list1 list2.pop(0) print('list1: %s' % list1) print('list2: %s' % list2)

思考: list1被改变了吗?

分析上面操作的过程:

定义变量list1:在内存中开辟一块空间,将列表 ['Tom', 'Jerry', 'Peter', 'Lily'] 保存到该内存空间(列表在内存中的保存没这么简单,此处只是为了便于理解),然后list1指向该内存空间的地址;

定义变量list2,并将list1赋值给它:实际上就是让list2也指向list1所指定的内存空间;

移除list2中的一个元素,就是从list2指向的内存地址所对应的内存空间中的内容中移除一个元素;

list1指向的内存地址发生改变了吗?-- 没有,因为list1并没有被重新进行赋值操作。

list2所指向的内存空间中的内容改变了吗? -- 是的,因为list1和list2指向的是同一个内存地址,通过list2修改了该内存地址中的内容后就相当于修改了list1。

So, 答案已经有了,list1被改变了,因此输出结果是:

list1: ['Jerry', 'Peter', 'Lily'] list2: ['Jerry', 'Peter', 'Lily'] 示例4:

其实函数参数的传递过程也是类似的,比如:

num1 = 10 name1 = 'Tom' list1 = ['Tom', 'Jerry', 'Peter', 'Lily'] def fun1(num2, name2, list2): num2 += 1 name2 = 'Jerry' list2.pop(0) print('num2: %d' % num2) print('name2: %s' % name2) print('list2: %s' % list2) fun1(num1, name1, list1) print('num1: %d' % num1) print('name1: %s' % name1) print('list1: %s' % list1)

为了跟上面的示例做对比,我故意把func1函数中的形参的名称写为num2、name2和list2,实际上他们可以为任意有意义的名称。

输出结果:

num2: 11 name2: Jerry list2: ['Jerry', 'Peter', 'Lily'] num1: 10 name1: Tom list1: ['Jerry', 'Peter', 'Lily'] 那么Python中变量拷贝是值拷贝还是引用拷贝呢?Python中的参数传递是值传递还是应用传递呢?

其实这是相同的问题,因为上面说过了:参数传递的过程实际上就像先拷贝,然后将拷贝传递给形参。如果是值拷贝,那么调用函数传参时就是值传递;如果是引用拷贝,那么调用函数传参时就是引用(内存地址)传递。其实通过上面的示例,我们大概可以猜测到对于列表类型的变量貌似是引用传递,但是数字和字符串类型的变量是值传递还是引用传递呢?Python中的参数的传递都是引用传递,关于这个问题我们可以通过Python内置的一个id()函数来进行验证。id()函数会返回指定变量所指向的内存地址,如果是引用传递,那么实参和被赋值后的形参所指向的内存地址肯定是相同的。事实上,确实如此,如下所示:

num1 = 10 name1 = 'Tom' list1 = ['Tom', 'Jerry', 'Peter', 'Lily'] def fun1(num2, name2, list2): print(id(num2), id(name2), id(list2)) print(id(num1), id(name1), id(list1)) fun1(num1, name1, list1)

输出结果:

1828586224 1856648389328 1856648385800 1828586224 1856648389328 1856648385800

实参和形参的内存地址一致,说明Python中的参数传递确实是“引用传递”。

这篇文章写了很久,想说的东西太多。有时候手放到键盘上放了许久,却不知从何写起。算是对知识点的梳理,也希望对他人有所帮助。关于Python中关于函数的其它内容,如:函数递归、匿名函数、嵌套函数、高阶函数等,之后再讲。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/82f73b1a8d40a964c0644454c0bfacb8.html