概念:
所有的变量都可以理解为内存中的一个对象的“引用”。类型是属于对象的,而不是变量。而对象有两种,“可更改”与“不可更改”对象。在python中,strings,tuples和numbers是不可更改的对象,而list,dict,set等则属于可以修改的对象。
下面来看下例子(numbers与list):
def foo(a):
print("foo_in:", a, id(a))
a += 1
print("foo_in:",a)
a = 1
foo(a)
print("foo_out:",a)
'''
输出:
foo_in: 1 1723752672
foo_in: 2 1723752704
foo_out: 1 1723752672
'''
def foo(a):
a.append(2)
print("foo_in:",a,id(a))
a = [1]
foo(a)
print("foo_out:",a,id(a))
'''
输出:
foo_in: [1, 2] 2240850668936
foo_out: [1, 2] 2240850668936
'''
可知,1、在在执行完a+=1之后,a引用中保存的值,即内存地址发生变化,由原来1对象所在的地址变为了2 这个实体对象所在的内存地址2、第二个例子a引用的内存值就不会发生改变
当一个引用传递给函数的时候,函数会自动复制一个引用,这个函数引用跟原来的那个引用没有关系,(A第一个例子中函数引用指向一个不可变对象,操作对象(也就是改变了指向的内存),当函数返回时跟原来的引用并没有影响。(B第二个例子,函数内引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改。
再说一个例子(元组与列表):
元组中的不可变值得是元素值不可变,但其元素可以为列表,当元素为列表时,对于这个不可变实际上是说这个元素引用的地址不可变,对列表的操作并不改变引用的地址。
append()没有改变列表的地址所以允许操作,而+法改变了引用地址所以不允许。