[英]Python confusing function reference
任何人都可以向我解釋為什么a
和b
下面的兩個函數表現不同。 函數a
在本地更改names
, b
更改實際對象。
我在哪里可以找到這種行為的正確文檔?
def a(names):
names = ['Fred', 'George', 'Bill']
def b(names):
names.append('Bill')
first_names = ['Fred', 'George']
print "before calling any function",first_names
a(first_names)
print "after calling a",first_names
b(first_names)
print "after calling b",first_names
輸出:
before calling any function ['Fred', 'George']
after calling a ['Fred', 'George']
after calling b ['Fred', 'George', 'Bill']
分配給函數內部的參數不會影響傳遞的參數。 它只使局部變量引用新對象。
同時, list.append
修改列表。
如果要更改函數內的列表,可以使用切片賦值:
def a(names):
names[:] = ['Fred', 'George', 'Bill']
函數a
創建一個新的本地變量names
並為其分配列表['Fred', 'George', 'Bill']
。 所以現在這是與全局 first_names
不同的變量,正如您已經發現的那樣。
使函數a
行為與函數b
相同的一種方法是使函數成為修飾符 :
def a(names):
names += ['Bill']
或者你可以做一個純粹的功能:
def c(names):
new_list = names + ['Bill']
return new_list
並稱之為:
first_names = c(first_names)
print first_names
# ['Fred', 'George', 'Bill']
純函數意味着它不會改變程序的狀態,即它沒有任何副作用,比如改變全局變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.