python中的的各类型变量及作为参数的特点

概念:

所有的变量都可以理解为内存中的一个对象的“引用”。类型是属于对象的,而不是变量。而对象有两种,“可更改”与“不可更改”对象。在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()没有改变列表的地址所以允许操作,而+法改变了引用地址所以不允许。

猜你喜欢

转载自blog.csdn.net/sinat_34461756/article/details/82983324