python 参数传递 传值还是传引用

个人推测结论:

可变对象传引用,不可变对象传值

python里的变量不同于c中地址储值模型

a=100
b=100
print(id(a),id(b),a==b,a is b)  #8790877986944 8790877986944 True True

这两个变量id相同,值相等,如果 a=a+1,a的id也变了 浮点数也是这样
看成和str tuple一样的不可变对象,实际操作可以改变,但都是副本操作
暂且管它叫不可变对象的副本操作

def f(x):
    x+=100
    return x
a=100
f(a)  #直接传变量  变量传值
print(a) # 100

def fn(data):
    for i in range(len(data)):
        data[i]+=1
l = [3,5,7]
fn(l)  #直接传改变原对象  list传引用 
print(l) #[4, 6, 8]

#以下是传副本方式 不改变原对象
l2 = [1,2,3]
fn(l2.copy()) 
print(l2) #[1, 2, 3]
fn(l2[:])
print(l2) #[1, 2, 3]

#str 不可变对象是传值
s = "do you like me!"
def str_answer(s):
    s=s+" No way!"
    print(s)
str_answer(s)
print(s)
print(s.upper()) #return a copy
print(s)

posted on 2019-03-16 19:28  ShawSpring  阅读(266)  评论(0编辑  收藏  举报

导航