【问题标题】:Why not call a reference when swapping elements using simultaneous assignment?为什么在使用同时赋值交换元素时不调用引用?
【发布时间】:2021-12-16 14:50:59
【问题描述】:

我有一个关于在 python 中交换元素的问题,我在网上找不到答案。我尝试的两种选择有什么区别,为什么只有第二种给出预期的输出? 我研究了一个选择排序算法,因此不得不交换列表的元素。我已将 max(my_list) 的值分配给变量 max_item

(1) 这是我第一次尝试交换max_itemmy_list[-1]

max_item, my_list[-1] = my_list[-1], max_item

实际输出是:

[value of max_item, value of max_item]

(2) 然后我尝试了以下方法:

my_list[my_list.index(max_item)], my_list[-1] = my_list[-1], my_list[my_list.index(max_item)]

这给出了预期的输出:

[value of my_list[-1], value of max_item]

非常感谢任何建议。提前致谢!

【问题讨论】:

  • 为什么你会期望max_item = my_list[-1] 改变my_list 的第一个元素?
  • minimal reproducible example - 不知道你想要什么。

标签: python list swap


【解决方案1】:

max_itemmy_list无关,即使你这样做:

max_item = max(my_list)

my_list 中包含最大项的索引和 max_item 都是 别名 绑定到同一个底层对象,但是当您重新分配 max_item 时(而不是就地改变它,例如使用变异方法调用或重新分配其属性之一),您重新绑定该名称,打破别名,my_list 中没有任何更改。

您的第二行代码有效,因为您在my_list 中重新绑定了适当的索引。不过,您只需要查找它以进行重新分配,因此您可以通过以下方式加快代码速度并简化一点:

my_list[my_list.index(max_item)], my_list[-1] = my_list[-1], max_item

【讨论】:

  • 谢谢!您能否举个例子来说明重新分配(底层对象的或max_item 的?)属性之一的含义?
  • @puh_dormouse:如果你使用了max_item = my_list[0],那么接下来使用max_item.attr = 123my_list[0] 也会反映这种变化(因为max_itemmy_list[0] 都继续为同一个对象)。
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2021-04-21
  • 2021-05-06
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多