鱼C论坛

 找回密码
 立即注册
查看: 1275|回复: 8

[已解决]关于在if里给变量赋值

[复制链接]
发表于 2022-1-5 19:15:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 BudingZY 于 2022-1-5 19:24 编辑

py2.7

第一段代码:
        if entityType & 0x00010000 == 0x00010000:
            dropItemName = "strongest:blue_powder_shard"
        elif entityType & 0x01000000 == 0x01000000:
            dropItemName = "strongest:red_powder_shard"
        elif entityType & 0x00001000 == 0x00001000:
            dropItemName = "strongest:white_powder_shard"
        elif entityType & 0x00040000 == 0x00040000:
            dropItemName = "strongest:green_powder_shard"
        else:
            return
        print dropItemName
dropItemName 在if里被赋值,在if外可以print

第二段代码:
        if newItemDict:
            newItemName = newItemDict['newItemName']
        print newItemName
newItemName也是在if中被赋值,但是在if外print,就会报错显示:
UnboundLocalError: local variable 'newItemName' referenced before assignment

为什么会这样?
本人是编程小白,所以不太懂


最佳答案
2022-1-5 19:40:40
本帖最后由 jackz007 于 2022-1-5 19:42 编辑
        if entityType & 0x00010000 == 0x00010000:
            dropItemName = "strongest:blue_powder_shard"
        elif entityType & 0x01000000 == 0x01000000:
            dropItemName = "strongest:red_powder_shard"
        elif entityType & 0x00001000 == 0x00001000:
            dropItemName = "strongest:white_powder_shard"
        elif entityType & 0x00040000 == 0x00040000:
            dropItemName = "strongest:green_powder_shard"
        else:                                                                               
            return
        这个代码在多数条件下都为 dropItemName 赋了值,所以,最后
        print dropItemName
        打印了变量值,唯一在 else 条件下没有为 dropItemName 赋值,但是,这个 else 只是执行了 return 语句,直接结束了函数调用,并不需要访问到变量 dropItemName,所以,不会出现问题。
        而下面这个代码就不一样了,变量 newItemName 只是在特定的条件下(newItemDict 逻辑值为真,应该是字典不为空)才会为 newItemName 赋值,而在 newItemDict  为假的情况下,变量 newItemName 就没有被赋值,但是,在 if 以后的 print 语句却并不受 newItemDict 逻辑值的约束,会无条件访问变量 newItemName,这个时候,系统当然就会报错了。
        if newItemDict:
            newItemName = newItemDict['newItemName']
        print newItemName
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-5 19:30:05 | 显示全部楼层
你的第一段代码也有问题啊   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 19:35:10 | 显示全部楼层
现在都3.10了,你还在用2.7?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 19:35:13 | 显示全部楼层
代码小白liu 发表于 2022-1-5 19:30
你的第一段代码也有问题啊

是哪里有错误吗,我在测试的时候是没问题呢,可以正常跑

不过if里赋值的作用域让我很懵,为什么有时候在if-block外可见,有时又不可见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 19:37:38 | 显示全部楼层
嘉岳呀 发表于 2022-1-5 19:35
现在都3.10了,你还在用2.7?

是一个游戏的mod要用2.7来做,所以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 19:40:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-1-5 19:42 编辑
        if entityType & 0x00010000 == 0x00010000:
            dropItemName = "strongest:blue_powder_shard"
        elif entityType & 0x01000000 == 0x01000000:
            dropItemName = "strongest:red_powder_shard"
        elif entityType & 0x00001000 == 0x00001000:
            dropItemName = "strongest:white_powder_shard"
        elif entityType & 0x00040000 == 0x00040000:
            dropItemName = "strongest:green_powder_shard"
        else:                                                                               
            return
        这个代码在多数条件下都为 dropItemName 赋了值,所以,最后
        print dropItemName
        打印了变量值,唯一在 else 条件下没有为 dropItemName 赋值,但是,这个 else 只是执行了 return 语句,直接结束了函数调用,并不需要访问到变量 dropItemName,所以,不会出现问题。
        而下面这个代码就不一样了,变量 newItemName 只是在特定的条件下(newItemDict 逻辑值为真,应该是字典不为空)才会为 newItemName 赋值,而在 newItemDict  为假的情况下,变量 newItemName 就没有被赋值,但是,在 if 以后的 print 语句却并不受 newItemDict 逻辑值的约束,会无条件访问变量 newItemName,这个时候,系统当然就会报错了。
        if newItemDict:
            newItemName = newItemDict['newItemName']
        print newItemName
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 19:43:20 | 显示全部楼层
jackz007 发表于 2022-1-5 19:40
这个代码在多数条件下都为 dropItemName 赋了值,所以,最后

        打印了变量值,唯一在 e ...

大概明白了,但是第二段的代码该怎么才能正常呢,只能用global吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-5 19:48:39 | 显示全部楼层
jackz007 发表于 2022-1-5 19:40
这个代码在多数条件下都为 dropItemName 赋了值,所以,最后

        打印了变量值,唯一在 e ...

我在前面定义这两个要赋值的变量后,在if外就可以访问到if赋值后的变量了;
虽然还不是很清晰,但感谢您的解答,让我明白了一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-5 20:03:22 | 显示全部楼层
本帖最后由 jackz007 于 2022-1-5 20:05 编辑
BudingZY 发表于 2022-1-5 19:48
我在前面定义这两个要赋值的变量后,在if外就可以访问到if赋值后的变量了;
虽然还不是很清晰,但感谢您 ...


        可以先为 newItemName 赋个初值,在 newItemDict 为真的时候,再对 newItemName 的值进行调整,这样,应该就不会出错了。
        newItemName = None
        if newItemDict:
            newItemName = newItemDict['newItemName']
        print newItemName
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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