在练习python实现数值排序问题时,遇到一个问题如下:
输入n个数,从小到大输出(没用sort方法):
#程序如下
num = str(input('input number:'))
num = num.split()
num =[int(k) for k in num]
def change(a,b):
a,b = b,a
return a,b
#冒泡排序
for i in range(len(num)-1):
for j in range(len(num)-1-i):
if num[j]>num[j+1]:
change(num[j],num[j+1])
print(num)
#输入"3 2 1"
#理论输出 :[1,2,3],
#实际结果:[3,2,1],原封不动的输出
经过排查发现问题出在了change函数的参数上,原来python分为可变对象和不可变对象。当函数传入的为不可变对象时,值不会改变;若是可变对象,才会改变。
简单测试如下:
#c函数传入参数为number;为不可变对象
def c(a,b):
a,b=b,a
return a,b
m=1
n=2
print(c(m,n))
print(m)
#实际输出:
#(2,1)
#1
#稍作改变:
l=[1,2]
def c(l):
l[0],l[1]=l[1],l[0]
return l
print(l)
#结果:[2, 1]
发现传入参数为list(可变对象)时,原输入参数会变。
因此原排序函数可改为如下(为了说明上述原因,其实可不用写change函数):
num = str(input('input number:'))
num = num.split()
num =[int(k) for k in num]
def change(l,n): #输入l为可变对象list
l[n],l[n+1]=l[n+1],l[n]
#冒泡排序
for i in range(len(num)-1):
for j in range(len(num)-1-i):
if num[j]>num[j+1]:
change(num,j)
print(num)
总结:
python函数传入参数时,需要根据自己的原意,输入可变或不可变类型的参数。其分类如下:
不可变(immutable):int、字符串(str)、float、(数值型number)、元组(tuple)、None(空)
可变(mutable):字典型(dictionary)、列表型(list), set(集合)
*菜鸡优快云第一篇文章——勇敢迈出第一步 *