叽叽喳喳,嘻嘻哈哈

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

函数的传参问题


n = 1
print id(n)

def e(n):
    print id(n)
    n = n+1  #生成了一个新对象,左边的n。是局部变量,函数内外,同名变量名是隔离的。
    print id(n)
    return n #将新对象返回
x = e(n)
print x
print id(x)

o  = 2
print id(o)
def m(n):
    print id(n)
    n = n + 1   #生成了一个新对象,但是该函数并没有将新对象返回,而是在函数运行完之后,这个局部变量被释放了。
    print id(n)
m(o)
print o
print id(o)

a = [1,2,3]
#a = [1,2,3,4,5,6,7,8,9]
print id(a)
def f(n):
    print id(n)
    m = n
    print id(m)
    if len(m) >5:   #如果这个为真 ,
        m = [9,8,7,6,5,4]  #那么 m也会是一个新对象。
        print id(m)
    for i,e in enumerate(m): 
        if isinstance(e,int):
            m[i]=str(e)+'e'    #如果上面那个if不为真,那么m和n一致,是同一个对象。那么对其修改,函数内外皆可见,如果 if条件为真,那么m和n 不再是同一个对象了。函数内外也就不一致了。
    return m
z = f(a)
print z
print id(z)
print a
print id(a)

s = 0  
def h():
    s = 10   #和函数外的 s 是隔离的。
    print s
print s
h()

python的函数是传对象 ,函数参数在传递过程中,将整个对象传入。对可变对象的修改,函数内外都是可见的。调用者和被调用者共享整个对象。
对于不可变对象,由于不可变对象的不可变性,所以,对不可变对象的修改,往往是生成一个新的对象来赋值实现的。

def a(**kwargs):
    print kwargs

a(host='127.0.0.1',db='mysq')
# a({"host":"127.0.0.1","db":"mysq"}) #error 
a(**{"host":"127.0.0.1","db":"mysq"})

posted on   叽叽喳喳,嘻嘻哈哈  阅读(141)  评论(0编辑  收藏  举报

编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf
点击右上角即可分享
微信分享提示