极品召唤兽 发表于 2020-7-22 22:49:34

关于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:52:00

本帖最后由 sunrise085 于 2020-7-22 22:53 编辑

看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1

Twilight6 发表于 2020-7-22 23:01:53


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

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

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

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

极品召唤兽 发表于 2020-7-22 23:16:30

Twilight6 发表于 2020-7-22 23:01
因为触发了 Python 的屏蔽机制,Python 的屏蔽机制是在运行代码前就会检测的

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

这个函数内部没有对 total_rent的定义吗
total_rent = n * rent
这个不算定义?

Twilight6 发表于 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 就算是没有被定义,导致报错了

极品召唤兽 发表于 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
这个报错什么意思?

极品召唤兽 发表于 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就是一个参数把....跟他有关系吗??

Twilight6 发表于 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 变量只是个局部变量,而局部变量本身就不是全局变量,就当然声明是全局变量

极品召唤兽 发表于 2020-7-22 23:40:53

Twilight6 发表于 2020-7-22 23:39
确实是我错了,我看错代码了,以为你传入的 参数是 total_rent ,但是你传入的是 3500

但是你错的原 ...

问题是 我在之后声明 为什么不行报错?

Twilight6 发表于 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)

极品召唤兽 发表于 2020-7-22 23:45:01

sunrise085 发表于 2020-7-22 22:52
看看我写的这个帖子Python细节之7、global与nonlocal的使用
不想多看的话,直接看最后一个例子的fun1

就算是有歧义 肯定是有优先级的吧 是不是优先在局部函数内新定义一个变量
这个 global本质是一个声明而不是一个应用?

极品召唤兽 发表于 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 是一个声明 而不是一个应用到全局?

Twilight6 发表于 2020-7-22 23:50:29

极品召唤兽 发表于 2020-7-22 23:48
这个 global 是一个声明 而不是一个应用到全局?



嗯 是声明这个变量在这个函数作用域内是全局变量,只在这个函数内部算,到另一个函数就不算了,要重新声明
页: [1]
查看完整版本: 关于global用法疑问 New!