如果想在函数内部改变函数外的变量值,用global语句完成:
在不传该变量值入函数的情况下要改变它的值:
>>> a = 3 >>> def f(): ... global a ... a = a-1 ... >>> f() >>> a 2
如果不声明global将会报错未找到:
>>> a = 3 >>> def f(): ... a = a-1 ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f UnboundLocalError: local variable 'a' referenced before assignment
如果是将该变量传参进入函数时,则该变量不变:
>>> def f(a): ... a = a-1 ... >>> f(a) >>> a 3 >>> def f(a): ... a = a-1 ... return a ... >>> f(a) 2 >>> a 3
注意,这仅当a为数的时候,当a为list,set,dict,等可切片的时,不用声明global也会改变。
a为tuple或str时也不会改变(注意因为tuple/str对象的不支持对其中单个元素/字符赋值如:a[0] = "0" #对字符串a第一个元素改变为“0”会报错)
>>> a = (1,2,3,4) >>> a[2] = 1 # 不可对单个改变 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> def f(a): ... a = (3,4) ... print(a) ... >>> f(a) (3, 4) >>> a (1, 2, 3, 4) ##################################### >>> a = "asd" >>> def f(a): ... a = a + "00" ... print(a) ... >>> f(a) asd00 >>> a 'asd' >>> a[0] = "0" # 不可对单个改变 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment
对于list,set,dict,涉及到切片等操作时,则会改变:
>>> a = [1,2,3,4] >>> def f(a): ... a[-1] = "0" ... print(a) ... >>> f(a) [1, 2, 3, '0'] >>> a [1, 2, 3, '0'] ##################上面切片下面未切片 >>> a = [1,2,3,4]>>> def f(a): ... a = [3,4] ... print(a) ... >>> f(a) [3, 4] >>> a [1, 2, 3, 4]
#######################
>>> a = [1,2,3,4]
>>> def f(a):
... a.append(0)
... print(a)
...
>>> f(a)
[1, 2, 3, 4, 0]
>>> a
[1, 2, 3, 4, 0]