鱼C论坛

 找回密码
 立即注册
查看: 1142|回复: 4

[已解决]全局变量和局部变量

[复制链接]
发表于 2017-12-9 20:24:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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=[[],[],[]]删掉了,程序果然跑不动了。

所以我的问题是,为啥在主程序中定义了一个变量,在函数中我并没声明他是全局变量,为啥函数过程中能对这个变量进行修改呢
最佳答案
2017-12-10 09:26:26
你把常量和变量的概念搞混了。

你的代码中 ans 被定义为一个二维空列表,是一个容器类型,属于变量;且作用域属于程序范围内所有函数内部都可见的。所以,你在函数中可以任意使用和修改她的值。

但如果 ans 的数据类型是常量(比如数字、字符串)的话,才会出现小甲鱼在课堂上提到的那种情况,看下图!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-9 21:31:25 From FishC Mobile | 显示全部楼层
因为你的函数中是直接使用这个列表,而不是初始化,就好比你直接
a[1]=3
编译器如何知道你的a是个什么东西?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-9 22:16:05 | 显示全部楼层
BngThea 发表于 2017-12-9 21:31
因为你的函数中是直接使用这个列表,而不是初始化,就好比你直接
a[1]=3
编译器如何知道你的a是个什么东 ...

可是小甲鱼不是在课上说过,如果在函数中不声明某个变量是全局变量的话,给这个变量赋值时,不管之前有没有这个变量,python都会在栈里面创建一个新的变量,来保护全局变量啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-9 22:20:30 | 显示全部楼层
BngThea 发表于 2017-12-9 21:31
因为你的函数中是直接使用这个列表,而不是初始化,就好比你直接
a[1]=3
编译器如何知道你的a是个什么东 ...

而且这个程序跑完了以后,我访问ans的值,ans也不再是[[],[],[]]了
但我在函数里并没有声明ans是全局变量啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-10 09:26:26 | 显示全部楼层    本楼为最佳答案   
你把常量和变量的概念搞混了。

你的代码中 ans 被定义为一个二维空列表,是一个容器类型,属于变量;且作用域属于程序范围内所有函数内部都可见的。所以,你在函数中可以任意使用和修改她的值。

但如果 ans 的数据类型是常量(比如数字、字符串)的话,才会出现小甲鱼在课堂上提到的那种情况,看下图!
1.jpg
2.jpg
33.jpg
1111.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表