关于global用法疑问 New!
本帖最后由 极品召唤兽 于 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
什么意思 本帖最后由 sunrise085 于 2020-7-22 22:53 编辑
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1
因为触发了 Python 的屏蔽机制,Python 的屏蔽机制是在运行代码前就会检测的
也就是你在函数内部重新创建个与全局变量同名的局部变量,就会触发屏蔽机制
屏蔽了外部的全局变量 total_rent,导致你函数内部的 total_rent 没有定义
在声明 total_rent是全局变量时提前调用导致报错的,所以你声明变量要写在使用 total_rent 变量之前
Twilight6 发表于 2020-7-22 23:01
因为触发了 Python 的屏蔽机制,Python 的屏蔽机制是在运行代码前就会检测的
也就是你在函数内部重新 ...
这个函数内部没有对 total_rent的定义吗
total_rent = n * rent
这个不算定义? 极品召唤兽 发表于 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 就算是没有被定义,导致报错了
sunrise085 发表于 2020-7-22 22:52
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用 global 进行明确指出。
第六行就被认为是重新定义全局变量 list1 了。这样就不会报错了。
这里重新定义 就是修改的意思吗(来源是你的帖子)
SyntaxError: name 'total_rent' is assigned to before global declaration
这个报错什么意思?
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就是一个参数把....跟他有关系吗?? 极品召唤兽 发表于 2020-7-22 23:32
我怎么感觉不太对.....rent 就为 total_rent ???这是从哪看出来的...rent就是一个参数把....跟他 ...
确实是我错了,我看错代码了,以为你传入的 参数是 total_rent ,但是你传入的是 3500
但是你错的原因也是因为屏蔽机制的原因,因为你函数内的 total_rent = n * rent 导致触发屏蔽机制,屏蔽了外部的total_rent = 0
所以此时 total_rent 变量只是个局部变量,而局部变量本身就不是全局变量,就当然声明是全局变量
Twilight6 发表于 2020-7-22 23:39
确实是我错了,我看错代码了,以为你传入的 参数是 total_rent ,但是你传入的是 3500
但是你错的原 ...
问题是 我在之后声明 为什么不行报错? 极品召唤兽 发表于 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) sunrise085 发表于 2020-7-22 22:52
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1
就算是有歧义 肯定是有优先级的吧 是不是优先在局部函数内新定义一个变量
这个 global本质是一个声明而不是一个应用? Twilight6 发表于 2020-7-22 23:42
你运行次不报错给我看看吧:
SyntaxError: name 'total_rent' is assigned to before global declaration on line 5
这个 global 是一个声明 而不是一个应用到全局? 极品召唤兽 发表于 2020-7-22 23:48
这个 global 是一个声明 而不是一个应用到全局?
嗯 是声明这个变量在这个函数作用域内是全局变量,只在这个函数内部算,到另一个函数就不算了,要重新声明
页:
[1]