1、shadows name ‘xxxx’ from outer scope 警告解决
要消除这个黄色的警告,只需要一个知识点:变量隐藏 (variables shadow)
"变量隐藏"的含义就只有一句话:内部定义的变量会屏蔽父级定义的同名变量。
怎么理解呢? 打个比方,比如我村子里有一个人叫李三,镇上也有一个人叫李三。当村子里的两个人聊天的时候说 李三 咋咋咋的时候,这个李三就是村子里的,而不是镇上的。
对于 Python3 来说,这句话的意思就是:函数内定义的变量会屏蔽模块内定义的变量
在PyCharm中提示 name ‘xxxx’ from outer scope,当你在外部有个相同名称的变量在方法内部被重新指定了新的值,也就是说你在外部的相同名称的变量压根就没有任何作用。所以PyCharm就回提示这个信息。这个时候就需要我们去调整具体代码了。
2、python的变量作用域:
python中的作用域分4种情况:
L:local,局部作用域,即函数中定义的变量;
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
G:global,全局变量,就是模块级别定义的变量;
B:built-in,系统固定模块里面的变量,比如int、bytearray等。
搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
x = int(2.9) # int built-in
g_count = 0 # global
def outer():
o_count = 1 # enclosing
def inner():
i_count = 2 # local
3、shadows name ‘xxxx’ from outer scope 出现的条件
如下所示,下面的代码出现了shadows name ‘xxxx’ from outer scope 警告:
def a():
param = 'b' # 这里就会出现这样的提示,因为在main定义的param对象被重新指定了新的值
print(param)
if __name__ == '__main__':
param = 'a'
a()
知道了原理,我们来谈谈 shadows name 'contract_version' from outer scope 出现的条件
(1)首先应该满足变量屏蔽。也就是函数内定义了一个和函数外同名的变量
(2)函数外定义的变量,没有其它地方使用过。
如果其它地方使用了,就不会触发这个警告了。比如下面的代码,是绝对不会触发警告的
def a():
param = 'b' # 这里就会出现这样的提示,因为在main定义的param对象被重新指定了新的值
print(param)
if __name__ == '__main__':
param = 'a'
print(param)
a()