print(i)就会抛出使用前未定义的错误。总的来说就是同名的全局和局部变量的操作,不能够冲突,否则Python解释器无法辨别和赋值变量。
python中,如图,为啥上面的报错,下面的两个都没问题?
第一部分:
因为上面的“x+=x”相当于在f2()函数中通过操作变量x得到变量x。
然而,f2()函数属于函数f1(),那么对于f2()函数来说,f1()函数中的变量也相当于f2()函数的全局变量,因此,f1()函数的变量x,就是相对于f2()函数的“全局变量”。
在Python中,您无法通过全局变量创建一个同名的局部变量。
也就是说,当你在f2()函数中想要定义一个局部变量x的时候,你使用了全局变量x,因为表达式左边为定义变量,右边为操作变量,这将导致解释器认为左边的x就是取值对象(先来后到),那么操作中的变量也会被认为局部变量中的x,然而局部变量中并没有x,那是你现在正在定义的,那么就会抛出使用前未定义的错误。
第二部分:
你将f2()的局部变量y定义为“x+1”。
表达式的右边是操作变量,变量x存在于全局变量(再次申明,是相对于函数f2()的全局变量),左边的y是你现在正在定义的局部变量,因此操作不矛盾。
第三部分
注意,你在f2()函数中并没有重新定义一个列表变量x,你只是重新定义了列表的第一个元素。
列表x存在于f2()的全局变量,你只是替换了其中的第一个元素,没有产生任何歧义。
如果你尝试以下代码,在f2()函数中通过x重新定义列表x:
def f1():
def f2():
x=x[0:3]#重新定义列表x
return x[0]
return f2()
x=[5,1,2,3]
i=f1()
print(i)
就会抛出使用前未定义的错误。
总的来说就是同名的全局和局部变量的操作,不能够冲突,否则Python解释器无法辨别和赋值变量。
2021-07-31