|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
def han(stp,dep,level):
if level==1:
return stp+"->"+dep
else:
temp=str(3-int(stp)-int(dep))
return han(stp,temp,level-1)+" "+stp+"->"+dep+" "+han(temp,dep,level-1)
def geshihua():
for j in range(3):
ans[j]=str(ta[j]) #赋值???????
fff=ans[j].find(',')
while fff>-1:
ans[j]=ans[j][:fff]+ans[j][fff+1:]
fff=ans[j].find(',')
ans[j]='[%-20s]' % ans[j][1:len(ans[j])-1]
return '%s %s %s' % tuple(ans)
#------------------------以下为主程序
a=int(input("请输入汉诺塔层数:"))
str1=han("0","2",a)
print(str1)
move=(len(str1)+2)//5
ans=[[],[],[]] #初次定义
ta=[list(reversed(range(1,a+1))),[],[]]
print(geshihua())
for i in range(move):
ta[int(str1[i*5+3])].append(ta[int(str1[i*5])].pop())
print(geshihua())
print(move)
这个程序能在python3.6上运行。大概就是一个汉诺塔的小程序。
写完这个程序我发现一个问题,就是ans这个变量我只在函数geshihua这里才用到,而且每次调用这个函数ans都要重新赋值完了才能用,所以按说在主程序定义ans完全是多余的,因为我不用到global ans这个语句的话每次一进到函数,按说python又会重新生成一个ans。。。
但是。。一个列表如果你不先把他定义成空列表ans=[[],[],[]], 然后直接给ans[0]赋值,python肯定是会报错的。。
然后我把主程序中的ans=[[],[],[]]删掉了,程序果然跑不动了。
所以我的问题是,为啥在主程序中定义了一个变量,在函数中我并没声明他是全局变量,为啥函数过程中能对这个变量进行修改呢
你把常量和变量的概念搞混了。
你的代码中 ans 被定义为一个二维空列表,是一个容器类型,属于变量;且作用域属于程序范围内所有函数内部都可见的。所以,你在函数中可以任意使用和修改她的值。
但如果 ans 的数据类型是常量(比如数字、字符串)的话,才会出现小甲鱼在课堂上提到的那种情况,看下图!
|
|