Python函數內部可以改變外部的變量,但需要注意變量的作用域和可變對象與不可變對象的不同。下面從幾個方面詳細闡述。
一、函數嵌套和變量作用域
在Python中,函數嵌套是很常見的,但是在函數嵌套中改變外部變量時,需要特別注意變量的作用域。
def outer():
x = 1
def inner():
nonlocal x
x += 1
inner()
print(x)
outer()
以上代碼中,inner函數內使用了nonlocal關鍵字,表示x是來自於外部作用域而非新聲明的變量,因此可以直接對x進行修改,並且outer函數執行後輸出的x值為2。
二、可變對象與不可變對象的不同
Python中可變對象和不可變對象是有區別的。可變對象指的是其內部的值可以被修改,例如列表、字典等;而不可變對象指的是其內部的值不能被修改,例如字符串、整數等。
def func(l):
l[0] = 100
print(l)
lst = [1, 2, 3]
func(lst)
print(lst)
以上代碼中,函數func接收一個列表l作為參數,在函數內部將l的第一個元素修改為100,並輸出修改後的列表。但是在函數外部再次打印lst的時候,發現lst的第一個元素也被修改為了100,這是因為lst是一個可變對象,傳遞給函數時僅傳遞了一個引用,最終修改了同一個對象。
def func(s):
s += ' Python'
print(s)
string = 'Hello'
func(string)
print(string)
如果是不可變對象呢?代碼中的字符串是一個不可變對象,func函數內部將字符串s改為了’Hello Python’,但是在函數外部打印時,原來的字符串’Hello’並沒有被修改。這是因為在函數內部重新賦值了s字符串,使s指向了一個新的字符串,並沒有修改原來的字符串。
三、關於函數返回值
如果想讓函數內部修改外部變量,並且不改變原變量的引用,可以考慮使用函數的返回值。
def func(lst):
lst_new = lst[:]
lst_new[0] = 100
return lst_new
lst = [1, 2, 3]
lst_new = func(lst)
print(lst)
print(lst_new)
以上代碼中,函數func內部先將lst列表拷貝一份,並將拷貝的列表修改後返回。在函數外部將返回值賦給lst_new變量,原來的lst列表並沒有被修改,lst_new則為修改後的新列表。
四、使用global關鍵字修改全局變量
如果想在函數內部修改全局變量,可以使用global關鍵字。
x = 1
def func():
global x
x += 1
func()
print(x)
以上代碼中,函數func使用了global關鍵字,表示x為全局變量,可以在函數內部對其進行修改。函數執行後,全局變量x的值變為2。
五、總結
Python函數內部可以改變外部的變量,但需要特別注意變量的作用域和可變對象與不可變對象的不同。如果想讓函數內部修改外部變量,並且不改變原變量的引用,可以考慮使用函數的返回值。如果想在函數內部修改全局變量,可以使用global關鍵字。
原創文章,作者:SOXXR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/374139.html