これを行うL1.append(elemento)
ときは、変数によって指定されたリストを実際に変更するメソッドを呼び出していますL1
。L1
との値を設定する他のすべてのコマンドは、L2
実際には新しい変数の新しい名前を作成しているだけです。
このバージョンは何も変更しません:
def altera(L1, L2):
for elemento in L2:
# create a new list and assign name L1
L1 = L1 + [elemento]
# create a new list and assign name L2
L2 = L2 + [4]
return L2
Lista1 = [1,2,3]
Lista2 = [1,2,3]
Lista3 = altera(Lista1, Lista2)
print Lista1
print Lista2
print Lista3
これはしますが:
def altera(L1, L2):
for elemento in L2:
# Call method on L1 that changes it
L1.append(elemento)
# Call method on L2 that changes it
L2.append(4)
# Change object pointed to by name L1 -- Lista1
L1[-1] = 10
# Change object pointed to by name L2 -- Lista2
del L2[0]
return L2[:]
Lista1 = [1,2,3]
Lista2 = [1,2,3]
Lista3 = altera(Lista1, Lista2)
print Lista1
print Lista2
print Lista3
L += [2]
ただし、とまったく同じではないトリッキーな問題がありL = L + 2
ます。拡張代入ステートメントのPython言語リファレンスの セクションでは、違いについて説明しています。
x + = 1のような拡張代入式は、x = x + 1として書き直すことができます。これにより、同様の効果が得られますが、まったく同じ効果は得られません。拡張バージョンでは、xは1回だけ評価されます。また、可能な場合は、実際の操作がインプレースで実行されます。つまり、新しいオブジェクトを作成してそれをターゲットに割り当てるのではなく、古いオブジェクトが変更されます。」</ p>