python中一切皆对象,
python中一切皆引用。
对象这是权威书籍中都有的话,但引用就不是了,根据c语言中的引用理解python中的‘变量’,更好理解。
引用指向对象,对象藏在引用后边,只能通过引用对对象操作,在python中所能见到的都是这个引用,而引用这个数据类型只保存一个数据就是对象的地址。
python中的数据类型分可变和不可变类型
字符串,元组,set,都是不可变,生成后其值无法改变,只能通过改变引用指向其他字符串来改变
>>> a="hello"
>>> id(a)
3070406016L
>>> a="world"
>>> id(a)
3070405952L
字典和列表都是可变对象,能通过引用对其改变
>>> a=[1,2,3,4]
>>> id(a)
3074666124L
>>> a[1]=5
>>> a
[1, 5, 3, 4]
>>> id(a)
3074666124L
一个对象赋值给引用表示把对象的地址赋值给了引用
一个引用赋值给引用 表示 把引用中的地址赋值给引用
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> a[0]=4
>>> b
[4, 2, 3]
有了上边的铺垫就能理解下边的函数中的参数
在大部分编程语言中,函数的参数都是“值传递”,c语言中的引用和指针虽然有址传递,但是那个址是指针或者引用的值,根本上讲也是传递的其中的内容 值,而且是复制进去的。
a=[1,2]
def f(arg):
arg.append(3)
print(a)
f(a)
print(a)
==========================
[1, 2]
[1, 2, 3]
结果会改变因为arg这个引用也指向a所以可以通过arg改变a值类似下边代码
a=[1,2]
b=a
b.append(3)
print(a,b)
[1, 2, 3] [1, 2, 3]
看另一个例子:
a=[1,2]
def f(arg):
arg=[3,4]
print(a)
f(a)
print(a)
结果
[1, 2]
[1, 2]
并没有改变a的值,因为参数传递的是引用的值就是参数指向了a指向的地址 但是在函数里把另一对像的地址赋值给了这个参数,至此参数跟a没有任何关系了,类似于下边代码
a=[1,2]
b=a
b=[3,4]
print(a,b)
这一切都是因为:
一切皆对象
一切皆引用
=赋值永远给的是地址
参数永远是新的引用