我们都知道多重分配可以一次分配多个变量 ,这在交换中很有用。 在这种情况下效果很好:
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中多次分配背后的机制,为此,最佳实践是什么,唯一的方法是临时变量?
感谢您的阅读,我非常感谢它对我的帮助。 :)
答案 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]]
。