Python は、myfunction1() へのエントリごとに新しいリストを作成し、それを「biglist」に割り当てる必要があります。
myfunction2() では、グローバル スコープの「biglist」への参照を渡しているため、コピーを行う必要はありません。
この 2 つには他にも微妙な違いがあります。その参照を渡すと、グローバル データが (おそらく望ましくない) 干渉を受けやすくなります。
>>> 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]
...一方、関数スコープで宣言すると、毎回新しく作成されることを意味します。たとえば、次のようになります。
>>> def myfunction4():
... mylist = [ 1,2,3,4,5 ]
... print mylist
... mylist[2] = 99
...
>>> myfunction4()
[1, 2, 3, 4, 5]
>>> myfunction4()
[1, 2, 3, 4, 5]
関数が呼び出されるたびに、新鮮でクリーンな、純粋なリストのコピーを使用して操作できます。
では、どうすれば両方の長所を活かすことができるでしょうか? これを試して:
>>> 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]
global-scope リストが変更されていないことがわかります。このメソッドに基づく新しい関数は次のようになります。
def myfunction1a(number):
mylist = biglist+[] # Copy-safe version
print number*mylist
ベンチマークのタイミングを使用して比較するとどうなりますか? この場合、関数内の「biglist」を実際に変更していないことはわかっていますが、グローバル データを共有する必要がある場合、およびリストがゼロからのみ構築されるという事実に慣れるのに慣れるのは悪いパラダイムではありません。 1 回 (そしてコピー) すると、パフォーマンスが向上する場合があります。