簡體   English   中英

Python混淆功能參考

[英]Python confusing function reference

任何人都可以向我解釋為什么ab下面的兩個函數表現不同。 函數a在本地更改namesb更改實際對象。

我在哪里可以找到這種行為的正確文檔?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM