3

重複の可能性:
関数の引数を渡す Python のオブジェクト呼び出しスタイルを理解する

私は最近これに出くわしました:

x = [1,2,3]

def change_1(x):
    x = x.remove(x[0])
    return x

結果は次のとおりです。

>>> change_1(x)
>>> x
[2, 3]

関数の内部に入るものは何でも外部の変数に影響を与えないと思っていたので、この動作は驚くべきものだと思います。さらに、基本的に同じことを行う例を作成しましたが、使用しませんremove:

x = [1,2,3]

def change_2(x):
    x = x[1:]
    return x

結果は次のとおりです。

>>> change_2(x)
[2, 3] # Also the output prints out here not sure why this is
>>> x
[1, 2, 3]

そして、期待どおりの結果が得られます。関数は x を変更しません。

したがって、それremoveは効果のある特定のものでなければなりません。ここで何が起こっているのですか?

4

3 に答える 3

7

紛らわしいことの 1 つは、さまざまなものを 'x' と呼んでいることです。例えば:

def change_1(x):       # the x parameter is a reference to the global 'x' list
    x = x.remove(x[0]) # on the left, though, is a new 'x' that is local to the function
    return x           # the local x is returned

>>> x = [1, 2, 3]
>>> y = change_1(x)    # assign the return value to 'y'
>>> print y
None                   # this is None because x.remove() assigned None to the local 'x' inside the function
>>> print x
[2, 3]                 # but x.remove() modified the global x inside the function

def change_2(x):
    x = x[1:]          # again, x on left is local, it gets a copy of the slice, but the 'x' parameter is not changed
    return x           # return the slice (copy)

>>> x = [1, 2, 3] 
>>> y = change_2(x)
>>> print x
[1, 2, 3]             # the global 'x' is not changed!
>>> print y
[2, 3]                # but the slice created in the function is assigned to 'y'
于 2012-04-23T03:04:12.527 に答える
2

n関数のパラメーター、またはを呼び出した場合、同じ結果が得られますq

影響を受けるのは変数名ではありません。xリストの範囲内とそのx範囲外は、2 つの異なる「ラベル」です。xただし、アタッチされた値を渡したのでchange_1()、両方とも同じオブジェクトを参照しています。x.remove()関数内でオブジェクトを操作するときは、基本的に次のように言っていることになりますx。基本的には、 of の 'x' ラベルを引き裂いて、yが指している場所に置くだけです。y=0; x=y[1, 2. 3]

于 2012-04-23T02:33:26.167 に答える
1

変数 x は、作成したリストへの単なる参照です。その関数を呼び出すと、その参照が値渡しされます。しかし、関数では、同じリストへの参照があるため、関数がそれを変更すると、任意のスコープで変更されます。

また、対話型インタープリターでコマンドを実行すると、変数に割り当てられていない場合、python は戻り値を出力します。

于 2012-04-23T02:30:12.777 に答える