ndrizza:
以下は、私が「スワップ」と「代入文の順次実行」を意味するもの3例を挙げて説明します。
実施例1(スワッピング)
タプルの割り当ては、変数の内容を交換するために非常に便利です。
我々は一時的な変数を必要とせずに明確なANの簡潔な方法で配列内の二つの要素の内容を入れ替えることができますどのように次の例が示します:
a = [1,2]
# prints [1, 2]
print(a)
a[0], a[1] = a[1], a[0]
# prints: [2,1] and not: [2, 2] as with a sequential assignment!
print(a)
スワップのような例を示し、私たちどのようにタプル割り当て振る舞う、代わりの最初の割り当てをやって、その後、第三の割り当てを行うための順次実行。
実施例2(スワップ)
ここでは三つの整数を交換別の例です:
x, y, z = 1, 2, 3
# prints: 1 2 3
print(x, y, z)
# swap contents in variables:
x, y, z = z, y, x
# prints: 3 2 1 and not: 3 2 3 as with a sequential assignment!
print(x, y, z)
実施例3(連続Assigment文)
物事は簡単なデータ型よりも複雑得ればしかし、タプルの割り当ても、順次割り当てのように振る舞うことがあります。
のは、以下のリンクリストの実装を考えてみましょう:
class ListNode:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __repr__(self):
is_first = True
current = self
l = []
safety_count = 0
while current and safety_count < 10:
if not is_first:
l.append(' -> ')
is_first = False
l.append(str(current.data))
current = current.next
safety_count += 1
return ''.join(l)
def __str__(self):
return self.__repr__()
この関数は、リンクリストの順番を逆に(と完全に正常に動作します):
def reverse_list_working(L):
if not L:
return L
pre_current = None
current = L
while True:
tmp_next = current.next
current.next = pre_current
pre_current = current
current = tmp_next
if not current:
break
return pre_current
今、私たちは、変数の内容のスワップを持っているために、タプルの割り当てによってTMP_変数を取り除くために誘惑されることがあります。
def reverse_list_not_working(L):
pre_current = None
current = L
while True:
pre_current, current, current.next = current, current.next, pre_current
if not current:
break
return pre_current
我々は最後の要素を得ればしかし、この実装は、エラーになります。ここでの問題は、タプルの割り当ては、順次割り当てのように振る舞うということです。
- アサイン:pre_current - >現在
- 割り当て:現在 - > current.next(リストの終わりにNoneです)
- アサイン:current.next - > pre_current:利回りエラー、現在はNoneですので!
アンドリュー・K.