鱼C论坛

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

变量申明在函数定义前不能使用

[复制链接]
发表于 2018-4-10 22:29:51 | 显示全部楼层 |阅读模式

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

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

x
请问变量申明在函数前不能使用,但是list却是可以呢?
list1=[]
def  get_digits(x):
    if x<10:
        list1.append(x%10)
        return list1
    else:
        list1.append(x % 10)
        get_digits(x//10)
        return list1
这里使用list1就不会报错;
同样的:
temp = 0
def count(a,b):
    while a>b>0:
        if a == b:
            temp +=1
            return temp
        else:

这边试图使用temp却不行?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-10 22:46:20 | 显示全部楼层
作用域不一样,不指明的话肯定会有问题

你第2个应该是 else:后面没写东西报的错吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-11 08:58:19 | 显示全部楼层
这种形式 temp += 1和重新赋值时一样的,需要先对temp进行赋值才能执行该语句
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-11 12:32:17 | 显示全部楼层
本帖最后由 jq100277 于 2018-4-11 12:33 编辑

第32讲的异常处理机制 课后练习里有类似的,,列表,元祖那些事容器类型,不会被屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 12:56:42 | 显示全部楼层
ba21 发表于 2018-4-10 22:46
作用域不一样,不指明的话肯定会有问题

你第2个应该是 else:后面没写东西报的错吧

应该不是,我else内容有写,这里面没贴出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 12:57:27 | 显示全部楼层
BngThea 发表于 2018-4-11 08:58
这种形式 temp += 1和重新赋值时一样的,需要先对temp进行赋值才能执行该语句

对,需要赋值,只是我的赋值语句是在函数体之外,所以有点奇怪,在函数体里面肯定是不会报错的了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-14 12:58:17 | 显示全部楼层
jq100277 发表于 2018-4-11 12:32
第32讲的异常处理机制 课后练习里有类似的,,列表,元祖那些事容器类型,不会被屏蔽

好的!谢谢,我还没看到那部分,后面继续看看。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 16:57:10 From FishC Mobile | 显示全部楼层
miyum 发表于 2018-4-14 12:57
对,需要赋值,只是我的赋值语句是在函数体之外,所以有点奇怪,在函数体里面肯定是不会报错的了!

我就是指的直接这样操作需要先赋值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 17:47:36 | 显示全部楼层
""" Case1: immutable object """

>>> num = 1
>>> def foo():
        num += 1

>>> foo()
Traceback (most recent call last):
  File "<pyshell#94>", line 1, in <module>
    foo()
  File "<pyshell#93>", line 2, in foo
    num += 1
UnboundLocalError: local variable 'num' referenced before assignment

===============================================

""" Case2: mutable object """

>>> lyst = []
>>> def bar():
        lyst.append(1)
       
>>> bar()
>>> lyst
[1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 17:52:04 | 显示全部楼层
case2是原地操作,如果复制操作也会报错。
>>> def bar():
        lyst += [1]

       
>>> bar()
Traceback (most recent call last):
  File "<pyshell#99>", line 1, in <module>
    bar()
  File "<pyshell#98>", line 2, in bar
    lyst += [1]
UnboundLocalError: local variable 'lyst' referenced before assignment
==========================================
上面这种情况就和num一样,而数字类型是mutable类型,要修改对象只支持复制操作。
==========================================

怎么解决?
使用global关键字声明作用域/命名空间。
以修改数字类型的全局变量num为例讲解:

>>> num =0
>>> def fun():
        global num
        num += 1

       
>>> fun()
>>> num
1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-15 14:49:19 | 显示全部楼层
ABC23 发表于 2018-4-14 17:52
case2是原地操作,如果复制操作也会报错。
>>> def bar():
        lyst += [1]

谢谢!这下清楚了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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