到底是值传递,还是引用传递?

到底是值传递,还是引用传递?

x=1
L=[]
L.append(x)

def f(x,L=[2]):
        x=2*x
        L.append(x)
        print L,x
       
f(x)
print "f(x):",L,x

f(x,L)
print "f(x,L):",L,x

得到的结果是:
[2, 2] 2
f(x): [1] 1
[1, 2] 2
f(x,L): [1, 2] 1

结果第二行用值传递完全解释得通。
结果第四行用引用传递完全解释得通。

那么问题是:python里到底使用之传递还是引用传递?

又或者是两者都使用,那么在什么情况下使用值传递,在什么情况下使用引用传递?
有没有相关资料?
其实到了python中差别不大.最主要的是python是通过赋值来创建一个对象的.所以对于python中的对象,

a='1'

这样不能叫修改,只能叫创建.如果你认为这样就是修改的话,就错了.一旦使用了赋值语句,就基本上与原对象无关了.而且python还有可变对象和不可变对象.象简单类型,整数,字符串,tuple都是不可变的.而象list, dict, object都是可变的.所以对于它们的修改一般是调用相应的方法,如对于list,你要a.append(b),对于dict你要a['b'] = '1'等.对象本身是没有什么变化,它的属性或值发生成变化.对于这种种情况,传值还是引用都是一样的.

不过,可能说引用更准确一些,比如:

a = []
def b(c):
    print id(c)

print id(a)
b(a)

你会看到两次打印出来的id值是一样的.说明是引用传递.也就是说函数b中的参数所指的对象就是a.理解为传值也无所谓,因为从赋值的角度来说,在函数中的赋值会创建新的对象,不会影响到原参数.

其实在python中变量名与真正的对象是一种绑定关系,或引用的关系.所以理解为引用更为合适.
明白了,谢谢。