[英]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.