鱼C论坛

 找回密码
 立即注册
查看: 2536|回复: 10

[已解决]各位大神求你们解答 谢谢 Python

[复制链接]
发表于 2016-9-1 19:14:37 | 显示全部楼层 |阅读模式
1鱼币
s=4
def fun1():
    a=3
   
    a=6 +s
    return a
fun1()
print(fun1())

为什么这个可以运行


s=4
def fun1():
   
   
    s=6+s
    return s
fun1()
print(fun1())
反而这个代码不能运行!  
   
为什么同样是引用全局变量的s的值第一个可以第二个不行 求解释 谢谢。我要的是题目的解释不是要你们完善后的代码,我知道我写的代码很烂很没水平,但我仅仅需要大神们解释为什么。谢谢了
最佳答案
2016-9-1 19:14:38
由于你没有在第二个函数里面先对 局部变量 s 进行赋值声明操作,函数运行的时候,自必就把全局变量 s= 4先引用后,加上 6 ,然后又赋值给了 s ,计算机内存中的 s 存放一直是全局变量 s=4,你通过局部赋值操作来改变全局变量s的值,在计算机看来就是 你在赋值前就已经引用了全局变量,而导致内存指派错误。
   正确的操作应该是你在使用局部变量的时候应该先定义一下 s 是局部变量,比如你的第二个代码可以改成:
s= 4
def fun1():
    s=0
    s= 6+s
    return s
fun1()
print(fun1())

这样的话计算机在运行的时候就知道,你是要对局部变量里面的 s=0 进行操作,而不是全局变量 s=4 进行操作。

最佳答案

查看完整内容

由于你没有在第二个函数里面先对 局部变量 s 进行赋值声明操作,函数运行的时候,自必就把全局变量 s= 4先引用后,加上 6 ,然后又赋值给了 s ,计算机内存中的 s 存放一直是全局变量 s=4,你通过局部赋值操作来改变全局变量s的值,在计算机看来就是 你在赋值前就已经引用了全局变量,而导致内存指派错误。 正确的操作应该是你在使用局部变量的时候应该先定义一下 s 是局部变量,比如你的第二个代码可以改成: s= 4 def fun1 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-1 19:14:38 | 显示全部楼层    本楼为最佳答案   
由于你没有在第二个函数里面先对 局部变量 s 进行赋值声明操作,函数运行的时候,自必就把全局变量 s= 4先引用后,加上 6 ,然后又赋值给了 s ,计算机内存中的 s 存放一直是全局变量 s=4,你通过局部赋值操作来改变全局变量s的值,在计算机看来就是 你在赋值前就已经引用了全局变量,而导致内存指派错误。
   正确的操作应该是你在使用局部变量的时候应该先定义一下 s 是局部变量,比如你的第二个代码可以改成:
s= 4
def fun1():
    s=0
    s= 6+s
    return s
fun1()
print(fun1())

这样的话计算机在运行的时候就知道,你是要对局部变量里面的 s=0 进行操作,而不是全局变量 s=4 进行操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-1 20:11:43 | 显示全部楼层
在函数体内引用全局变量时,会创建一个新的局部变量,并且屏蔽全局变量,可以用global关键字来声明其为全局变量
同理,可以用nonlocal关键字来声明为非局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-1 20:43:35 | 显示全部楼层
s未定义,s局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 21:18:50 | 显示全部楼层
大鲨鱼2 发表于 2016-9-1 20:11
在函数体内引用全局变量时,会创建一个新的局部变量,并且屏蔽全局变量,可以用global关键字来声明其为全局 ...

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-4 17:52:01 | 显示全部楼层
在第二段代码中,S是局部变量,无法访问全局变量——即LINE1定义的S。所以会报错。
你可以在函数体内使用‘global s ’将其定义为全局变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-8 14:36:59 | 显示全部楼层
哈哈,哈好学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-9 23:41:16 | 显示全部楼层
变量作用域的问题,下边这个执行不成功的这个已经声明s全局变量了,函数内部s与全局s冲突了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-15 12:29:00 | 显示全部楼层
为什么要空出那么多行呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-15 12:57:03 | 显示全部楼层
把参数设置成s就成了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-16 12:35:58 | 显示全部楼层
其实,是这样的,第一个能运行是因为它只是在函数中访问全局变量,并没有给它赋值,所以当然可以啦
而第二个不行的原因是因为你给它赋值了,这个时候python的作法是将全局变量屏蔽掉,也就是说s这个名字是一个新的变量,而新的变量在没有赋值的情况下是没有意义的,也是不允许的
如果还没弄懂的话,那就@我吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-5 16:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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