Python多重分配背后的机制

时间:2019-03-27 02:52:00

标签: python

我们都知道多重分配可以一次分配多个变量 ,这在交换中很有用。 在这种情况下效果很好:

nums = [2, 0, 1]
nums[0], nums[2] = nums[2], nums[0]
# nums=[1, 0, 2] directly, correct

,但在更复杂的情况下失败,例如:

nums = [2, 0, 1]
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]
# nums=[1, 2, 1] directly, incorrect

nums = [2, 0, 1]
tmp = nums[0]
nums[0], nums[tmp] = nums[tmp], nums[0]
# nums=[1, 0, 2] with temporary variable, correct

nums[nums[0]]中,nums[0]似乎在之前被分配,而不是一次分配。 它还在复杂的链接列表节点交换中失败,例如:

cur.next, cur.next.next.next, cur.next.next = cur.next.next, cur.next, cur.next.next.next
# directly, incorrect

pre = cur.next
post = cur.next.next
cur.next, post.next, pre.next = post, pre, post.next
# with temporary variable, correct

所以我想知道Python中多次分配背后的机制,为此,最佳实践是什么,唯一的方法是临时变量?

感谢您的阅读,我非常感谢它对我的帮助。 :)

1 个答案:

答案 0 :(得分:2)

<body>
  <div class="header">
    <div id="circleTop"></div>
    <div class="headerBox">
      <h1>Headline</h1>
      <h2>Subheading</h2>
    </div>
  </div>

  <div class="footer">
    <div id="circleBottom"></div>
    <div class="section">
      <a href="#">Link</a>
      <a href="#">Link</a>
    </div>
    <div class="otherLinks">
      <p>Lorem Ipsum Dolor Sit Amet</p>
    </div>
  </div>
</body>

等效于

a, b = c, d

我个人建议您像显示的那样使用临时变量显式地编写复杂的赋值。

另一种方法是仔细选择分配中元素的顺序:

temp = (c, d)
a = temp[0]  # Expression a is evaluated here, not earlier
b = temp[1]  # Expression b is evaluated here, not earlier

按预期更改nums[nums[0]], nums[0] = nums[0], nums[nums[0]]