Python函数引用

Python函数引用,python,list,reference,Python,List,Reference,有人能给我解释一下为什么a和b下面的两个函数的行为不同吗。函数a在本地更改名称,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_na

有人能给我解释一下为什么
a
b
下面的两个函数的行为不同吗。函数
a
在本地更改
名称
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']
分配给它。因此,正如您已经发现的,这是一个不同于全局
名字的变量

您可以阅读有关修改函数内列表的内容

使函数
a
的行为与函数
b
相同的一种方法是使函数a修改器

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']

纯函数意味着它不会改变程序的状态,也就是说,它不会产生任何副作用,比如改变全局变量。

python名称、赋值等的好入门: