鱼C论坛

 找回密码
 立即注册
查看: 1849|回复: 12

[已解决]关于global用法疑问 New!

[复制链接]
发表于 2020-7-22 22:49:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 极品召唤兽 于 2020-7-22 23:38 编辑
total_rent = 0

def calc_rent(n, rent):
  global total_rent
  total_rent = n * rent


calc_rent(12, 3500)
print(total_rent)

这里的global如果在  total_rent = n * rent  下面 就会报错
为什么不行?

报错
SyntaxError: name 'total_rent' is assigned to before global declaration
什么意思
最佳答案
2020-7-22 23:50:29
极品召唤兽 发表于 2020-7-22 23:48
这个 global 是一个声明 而不是一个应用到全局?



嗯 是声明这个变量在这个函数作用域内是全局变量,只在这个函数内部算,到另一个函数就不算了,要重新声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-22 22:52:00 | 显示全部楼层
本帖最后由 sunrise085 于 2020-7-22 22:53 编辑

看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 23:01:53 | 显示全部楼层

因为触发了 Python 的屏蔽机制,Python 的屏蔽机制是在运行代码前就会检测的

也就是你在函数内部重新创建个与全局变量同名的局部变量,就会触发屏蔽机制

屏蔽了外部的全局变量 total_rent  ,导致你函数内部的 total_rent 没有定义

在声明 total_rent  是全局变量时提前调用导致报错的,所以你声明变量要写在使用 total_rent 变量之前

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:16:30 | 显示全部楼层
Twilight6 发表于 2020-7-22 23:01
因为触发了 Python 的屏蔽机制,Python 的屏蔽机制是在运行代码前就会检测的

也就是你在函数内部重新 ...

这个函数内部没有对 total_rent的定义吗
total_rent = n * rent
这个不算定义?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 23:20:16 | 显示全部楼层
极品召唤兽 发表于 2020-7-22 23:16
这个函数内部没有对 total_rent的定义吗
total_rent = n * rent
这个不算定义?


这个叫重新创建了个与全局变量名相同的局部变量,导致触发屏蔽机制

屏蔽了外部的 total_rent,此时因为你将全局变量 total_rent 当作参数传入函数的 rent 参数中去

所以此时 rent 就为 total_rent 即 total_rent = n * rent 等价于 total_rent = n * total_rent,而因为你触发屏蔽机制屏蔽了全局变量 total_rent

所以这里的等号右边的 total_rent 就算是没有被定义,导致报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:26:20 | 显示全部楼层
sunrise085 发表于 2020-7-22 22:52
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用 global 进行明确指出。
第六行就被认为是重新定义全局变量 list1 了。这样就不会报错了。

这里重新定义 就是修改的意思吗(来源是你的帖子)
SyntaxError: name 'total_rent' is assigned to before global declaration
这个报错什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:32:39 | 显示全部楼层
Twilight6 发表于 2020-7-22 23:20
这个叫重新创建了个与全局变量名相同的局部变量,导致触发屏蔽机制

屏蔽了外部的 total_rent,此时 ...
所以此时 rent 就为 total_rent 即 total_rent = n * rent 等价于 total_rent = n * total_rent,而因为你触发屏蔽机制屏蔽了全局变量 total_rent


我怎么感觉不太对.....rent 就为 total_rent ???这是从哪看出来的...rent就是一个参数把....跟他有关系吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 23:39:35 | 显示全部楼层
极品召唤兽 发表于 2020-7-22 23:32
我怎么感觉不太对.....rent 就为 total_rent ???这是从哪看出来的...rent就是一个参数把....跟他 ...


确实是我错了,我看错代码了,以为你传入的 参数是 total_rent ,但是你传入的是 3500

但是你错的原因也是因为屏蔽机制的原因,因为你函数内的 total_rent = n * rent 导致触发屏蔽机制,屏蔽了外部的  total_rent = 0

所以此时 total_rent 变量只是个局部变量,而局部变量本身就不是全局变量,就当然声明是全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:40:53 | 显示全部楼层
Twilight6 发表于 2020-7-22 23:39
确实是我错了,我看错代码了,以为你传入的 参数是 total_rent ,但是你传入的是 3500

但是你错的原 ...

问题是 我在之后声明 为什么不行报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 23:42:09 | 显示全部楼层
极品召唤兽 发表于 2020-7-22 23:40
问题是 我在之后声明 为什么不行报错?


你运行次不报错给我看看吧:
total_rent = 0

def calc_rent(n, rent):
  total_rent = n * rent
  global total_rent


calc_rent(12, 3500)
print(total_rent)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:45:01 | 显示全部楼层
sunrise085 发表于 2020-7-22 22:52
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1

就算是有歧义 肯定是有优先级的吧 是不是优先在局部函数内新定义一个变量
这个 global本质是一个声明而不是一个应用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-22 23:48:55 | 显示全部楼层
Twilight6 发表于 2020-7-22 23:42
你运行次不报错给我看看吧:
SyntaxError: name 'total_rent' is assigned to before global declaration on line 5
这个 global 是一个声明 而不是一个应用到全局?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 23:50:29 | 显示全部楼层    本楼为最佳答案   
极品召唤兽 发表于 2020-7-22 23:48
这个 global 是一个声明 而不是一个应用到全局?



嗯 是声明这个变量在这个函数作用域内是全局变量,只在这个函数内部算,到另一个函数就不算了,要重新声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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