ときに関与VARSの「スワップ」などのタプル割り当て振る舞い、そしてときには、「個々の順次割り当て」のように動作しないのでしょうか?

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

我々は最後の要素を得ればしかし、この実装は、エラーになります。ここでの問題は、タプルの割り当ては、順次割り当てのように振る舞うということです。

  1. アサイン:pre_current - >現在
  2. 割り当て:現在 - > current.next(リストの終わりにNoneです)
  3. アサイン:current.next - > pre_current:利回りエラー、現在はNoneですので!
アンドリュー・K.

あなたはバイトコードに簡単な例(三つの整数)と見てみる場合は、以下を参照してください。

...
LOAD_NAME                2 (z)
LOAD_NAME                1 (y)
LOAD_NAME                0 (x)
ROT_THREE
ROT_TWO
STORE_NAME               0 (x)
STORE_NAME               1 (y)
STORE_NAME               2 (z)
...

つまり答えは、あなたが最初の右辺の値を取得しているスタックに、あなたは、(単純なケースだけで値が変数によって参照されますが、複雑な場合には、それはより広範な影響を与える可能性がある)、並べ替え、その後、あなたの割り当てスタックから値左側の変数に対応します。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=402354&siteId=1