Python必须在myfunction1()的每个条目上创建一个新列表,并将其分配给“biglist”。在
在myfunction2()中,传递对全局范围的“biglist”的引用,因此不需要进行复制。在
两者之间还有其他微妙的区别。传入该引用会使全局数据受到(可能是不需要的)干扰:>>> biglist = [ 1,2,3,4,5,6,7,8,9 ]
>>> def myfunction3(mylist):
... mylist[2] = 99
...
>>> biglist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> myfunction3(biglist)
>>> biglist
[1, 2, 99, 4, 5, 6, 7, 8, 9]
…然而,在函数作用域中声明它意味着每次都会重新创建它。因此,例如:
^{pr2}$
每次调用函数时,都有一个新的、干净的、未经修饰的列表副本。在
那么你怎样才能两全其美呢?试试这个:>>> def myfunction5():
... mylist = biglist+[] # Make a private copy
... mylist[4] = 99
...
>>> biglist
[1, 2, 99, 4, 5, 6, 7, 8, 9]
>>> myfunction5()
>>> biglist
[1, 2, 99, 4, 5, 6, 7, 8, 9]
您可以看到全局范围列表没有改变。基于此方法,您的新功能将是:def myfunction1a(number):
mylist = biglist+[] # Copy-safe version
print number*mylist
使用您的基准时间进行比较如何?我知道在这种情况下,您实际上并没有修改函数中的“biglist”,但是如果您必须共享全局数据,那么习惯使用它并不是一个坏的范例,而且列表只从头构建一次(然后复制)可能会带来一些性能改进。在