Python 传参方式;可变/不可变对象

1.以下Python代码分别输出什么?

         考察点:传参方式;可变对象。 

               Python传递值还是引用呢?都不是,唯一支持的参数传递是共享传参。

               Call by Object (Call by Reference or Call by Sharing)

               Call by sharing(共享传参)。函数形参获得实参中各个引用的副本,实际是通过对象引用进行传递的。

(1)可变类型作为参数(可变对象,形参和实参都是指向同一个对象,叫做对象传递或引用传递)

def flist(l):
	l.append(0)
	print(l)


ll = []
flist(ll)
flist(ll)

list 是可变对象

输出结果:

              [0]

              [0, 0]

 

(2)不可变类型作为参数(不可变对象,表现像copy的值,去修改它的新的这个值,实际不是这样)

def fstr(s):
	s += 'a'
	print(s)


ss = 'hehe'
fstr(ss)
fstr(ss)

 

str 是不可变对象

输出结果:

              hehea

              hehea

2.Python如何传递参数?

python通过对象引用进行传递,根据传递变量是可变还是不可变对象,然后得到两种不同结果。所以既有表现得像传引用,又有时候表现得像传入一个值。

         Python中一切皆对象,传递参数的时候实际是通过对象引用进行传递的就是实参和形参都指向同一个对象,但是因为Python里面有可变和不可变对象,所以对可变和不可变表现出了两种作用,一种是不可变对象时候变现的有点像传值就相当于把原来值拷贝一下其实并不是这样;一种是可变对象,对于可变对象来说因为指向的本身就是同一个对象所以直接可以在内存中修改它。而不可变对象不可修改它是因为每次赋值时候它会创建一个新的对象并且让你原来的形参去指定新对象。

3.Python可变/不可变对象

搞懂可变和不可变内置对象有利于理解函数参数的副作用即会不会修改它。

 哪些是可变对象?哪些是不可变对象?

        不可变对象 bool / int / float / tuple/ str / frozenset(固定集合)

        可变对象 list / set / dict

        (需要注意的是:如果传递的是可变对象作为参数,修改它的时候对外面是可见的)

 

4.一个小例题,请问这段代码会输出什么结果?

         提示:可变对象的一个错觉以为改变原来的值。

 

def clear_list(l):
    l = [ ]     # 形参指向一个新的值
    
ll = [1, 2, 3]  
clear_list(ll)
print(ll)  

这个过程还是解释一下:首先在一块内存中定义一个列表[1, 2, 3], 定义变量时候 ll 变量指向这块内存,调用函数传入 ll 实参,此时 l 形参也指向和 ll一样这块内存。这时候又在一块内存中定义空列表[],并赋值给 l ,然后 l 指向就变了指向了空列表这块内存。列表[1, 2, 3]并没有被操作。ll 指向没有改变所以值也就不变。

输出结果:

[1, 2, 3]

5.Python可变参数作为默认参数(默认参数只计算一次)

def flist(l=[1]):
    l.append(1)
    print(l)

flist()
flist()

输出结果:

[1, 1]

[1, 1, 1]

 

 

 

 

你可能感兴趣的:(python经典例题,Python语言)