BudingZY 发表于 2022-1-5 19:15:38

关于在if里给变量赋值

本帖最后由 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 dropItemNamedropItemName 在if里被赋值,在if外可以print

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

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


代码小白liu 发表于 2022-1-5 19:30:05

你的第一段代码也有问题啊   

嘉岳呀 发表于 2022-1-5 19:35:10

现在都3.10了,你还在用2.7?

BudingZY 发表于 2022-1-5 19:35:13

代码小白liu 发表于 2022-1-5 19:30
你的第一段代码也有问题啊

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

不过if里赋值的作用域让我很懵,为什么有时候在if-block外可见,有时又不可见

BudingZY 发表于 2022-1-5 19:37:38

嘉岳呀 发表于 2022-1-5 19:35
现在都3.10了,你还在用2.7?

是一个游戏的mod要用2.7来做,所以{:10_250:}

jackz007 发表于 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

BudingZY 发表于 2022-1-5 19:43:20

jackz007 发表于 2022-1-5 19:40
这个代码在多数条件下都为 dropItemName 赋了值,所以,最后

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

大概明白了,但是第二段的代码该怎么才能正常呢,只能用global吗

BudingZY 发表于 2022-1-5 19:48:39

jackz007 发表于 2022-1-5 19:40
这个代码在多数条件下都为 dropItemName 赋了值,所以,最后

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

我在前面定义这两个要赋值的变量后,在if外就可以访问到if赋值后的变量了;
虽然还不是很清晰,但感谢您的解答,让我明白了一些

jackz007 发表于 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
页: [1]
查看完整版本: 关于在if里给变量赋值