1

2 つの方法を次に示します。1 つは変数 x を変更し、もう 1 つは変更しません。これがなぜなのか説明していただけますか?

x = [1,2,3,4]
def switch(a,b,x):
     x[a], x[b] = x[b], x[a]
switch(0,1,x)
print(x)
[2,1,3,4]


def swatch(x):
    x = [0,0,0,0]

swatch(x)
print(x)
[2,1,3,4]
4

1 に答える 1

3

関数定義

def swatch(x):

ローカル変数であると定義xします。

x = [0, 0, 0, 0]

ローカル変数xを新しいリストに再割り当てします。xこれは、同じ名前のグローバル変数には影響しません。


xの引数から削除できますswatch:

def swatch():
    x = [0, 0, 0, 0]

しかし、Pythonが次のような関数定義内で代入に遭遇したとき

x = [0, 0, 0, 0]

Python はデフォルトでローカル変数xを考慮します。これに値を割り当てても、グローバル変数.xx

xグローバル変数になりたいことを Python に伝えるには、次のglobal宣言を使用する必要があります。

def swatch():
    global x
    x = [0,0,0,0]
swatch()

ただし、この場合、xis mutableであるため、次のように定義できますswatch

def swatch(x):
    x[:] = [0,0,0,0]

x内部swatchはローカル変数ですがswatch

swatch(x)  # the global variable x

同じ名前のグローバル変数と同じリストを指します。

x[:] = ...元のリストを指しているまま、 の内容を変更します。したがって、これはグローバル変数が指す値も変更します。xxx


def switch(a,b,x):
     x[a], x[b] = x[b], x[a]

元のリストを指しているx間に の内容が変更される別の例です。xしたがって、ローカルをx変更すると、グローバルも変更さxれます。

于 2013-05-18T15:04:42.850 に答える