函数的传参问题


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"})
原文地址:https://www.cnblogs.com/jijizhazha/p/7122725.html