3
def f(x, y):
   x.append(x.pop(0))
   x.append(y[0])
   return x

a = [4,5]
b = [1,2,3]
w = f(a,b) + f(a,b)

w は [4,1,5,1,4,1,5,1] となる、1]

どうしてこれなの?

f(a,b) = [5,4,1] ですよね? したがって、a = [5,4,1] および b = [1,2,3] になります。

したがって、f(a,b) = [4,1,5,1] は [5,4,1] + [4,1,5,1] = [5,4,1,4,1] になります。 ,5,1] NOT [4,1,5,1,4,1,5,1]

コードがこれを変更するのはなぜですか? 自分でコードを実行しようとすると、何が間違っていますか?

4

3 に答える 3

6

どちらの呼び出しも同じリスト、つまり にバインドされたオブジェクトをa返し、その結果、2 番目に返された値 (まだ にバインドされているオブジェクトa) がそれ自身に追加されます。この関数はリストを変更するだけ、決して置き換えません。

于 2013-11-07T05:24:33.357 に答える
3

あなたの問題は、コードが元のリストを変更し、それへの参照を返すことです。fを 2 回目に呼び出すと (1 文字の名前を使用しないでください!!!)、元の呼び出しの結果も変更されます。段階的にやってみましょう:

n [53]: a1 = f(a,b)

In [54]: a
Out[54]: [5, 4, 1]

In [55]: a2 = f(a,b)

In [56]: a2
Out[56]: [4, 1, 5, 1]

In [57]: a
Out[57]: [4, 1, 5, 1]

これは私のポイントを示しています(関数IDはオブジェクトへの参照を返します)

In [77]: id(a)
Out[77]: 145114860

In [78]: id (f(a,b))
Out[78]: 145114860

ご覧のとおり、関数には副作用があります。このように書き直すと

def f(x, y):
    x.append(x.pop(0))
    x.append(y[0])
    return copy(x)

2 番目の呼び出しは、最初の呼び出しの結果に影響しません -

In [74]: id(a)
Out[74]: 145114860

In [75]: id (f(a,b))
Out[75]: 145113356

結果は [5, 4, 1, 4, 1, 5, 1] になります。

于 2013-11-07T05:38:14.290 に答える
0

f(a,b) = [5,4,1] ですよね? したがって、a = [5,4,1] および b = [1,2,3] になります。

すべて正しい。でも。あなたが何をしているのかを見るとf、それは変化したものを返すだけですx(つまり mutating a)。したがって、2回実行します。

f(a,b)
Out[40]: [5, 4, 1]

a
Out[41]: [5, 4, 1]

f(a,b)
Out[42]: [4, 1, 5, 1]

a
Out[43]: [4, 1, 5, 1]

それをそれ自体と連結します。つまり、 2回変異した後wです。a + aa

于 2013-11-07T05:40:24.983 に答える