Python学习-Day5-函数(二)

本文探讨Python中的函数,包括它们作为对象的特性、变量作用域(全局与局部)、参数传递的细节(可变与不可变对象的区别)、拷贝类型(浅拷贝与深拷贝)、不同类型的参数以及递归函数的应用,如计算阶乘。重点解析了参数传递时如何影响对象及其引用,以及如何通过lambda表达式和eval()函数增强函数的使用。
摘要由CSDN通过智能技术生成

函数也是对象,内存底层分析

def test01():
    print("Man")
test01()
c = test01
c()

Man
Man

变量的作用域(全局变量和局部变量)

在这里插入图片描述

a = 3
def test01():
    b = 4
    print(b)
    a = 300
    print(a)
test01()
print(b)
print(a)

Traceback (most recent call last):
  File "C:/Users/admin/PycharmProjects/turtle/test.py", line 8, in <module>
    print(b)
NameError: name 'b' is not defined
4
300

在这里插入图片描述
print(locals()) 打印输出的局部变量

局部变量和全局变量效率测试

在这里插入图片描述
在这里插入图片描述

参数的传递

从实参到形参的赋值操作。
对可变对象进行写操作,直接作用于原对象本身。
对不可变对象进行写操作,会产生一个新的对象空间,并用新的值填充这块空间。
可变对象:字典、列表、集合、自定义的对象等。
不可变对象:数字、字符串、元组、function等

传递可变对象的引用

传递参数是可变对象,实际传递的还是对象的引用。

a = [10,20]
print(id(a))
print(a)
def test01(m):
    print(id(m))
    m.append(300)
    print(id(m))
test01(a)
print(a)

1780838125960
[10, 20]
1780838125960
1780838125960
[10, 20, 300]

传递不可变对象的引用

参数是不可变对象,实际传递的还是对象的引用。在赋值操作时,由于不可变对象无法修改,系统会新创建一个对象。

a = 100
def f1(n):
    print("n:",id(n))
    n=n+200
    print("n:",id(n))
    print(n)
f1(a)
print("a",id(a))

n: 140713297817072
n: 1785365939024
300
a 140713297817072

浅拷贝和深拷贝

copy()、deepcopy()
浅拷贝:不拷贝子对象的内容,只拷贝子对象的引用。
深拷贝:会连子对象的内存全部拷贝,对子对象的修改不会影响原对象。

#浅拷贝
import copy
a = [10,20,[
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值