Python列表值不会改变

时间:2015-07-03 18:00:32

标签: python

我正在努力解决问题。在尝试更改列表值时,我发现了一个奇怪的列表行为。我无法更改列表元素的值。

top = list(map(int, raw_input().split()))
staff = list(map(int, raw_input().split()))

ceo  = top[0]
coo = top[1]
cto = top[2]

top.extend(staff)
alls = sorted(top)
tot = len(alls)
print(alls)

alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2]
print(alls)

alls[0], alls[alls.index(coo)] = alls[alls.index(coo)], alls[0]
alls[-1], alls[alls.index(cto)] = alls[alls.index(cto)], alls[-1]

print(alls)

以下是该计划的输出:

输入:

13 11 17
12 10

输出

[10, 11, 12, 13, 17]
[10, 11, 12, 13, 17]
[10, 11, 12, 13, 17]

为什么所有列表值都没有变化?我做错了吗?

编辑: 问题陈述:https://www.hackerearth.com/codejunk/algorithm/steal-the-show/

我知道我的方法不是解决这个问题的最佳方法,但我只是想知道为什么列表的值没有改变?

1 个答案:

答案 0 :(得分:4)

这里的问题是你的运营商组合。我以第一个作业为例进行剖析:

alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2]

会发生什么:

  1. ceo在开头是13,所以当执行语句时,alls.index(ceo)将为3 ...但是等待... 之前分配

  2. 首先评估分配前的值。 alls [alls.index(ceo)]将是13 - 难怪,因为首席执行官是13岁。

  3. alls [tot / 2]将为12,因为tot / 2为2(索引将为整数,因此逗号后面的部分将丢失)。

  4. 所以在右侧我们会得到(13,12)。

  5. 现在,到了作业。将首先分配alls [tot / 2](但你不能相信它,因为这是实现细节!)。

  6. 所以alls [2]将是13 !!

  7. 现在,作业的第二部分...... alls.index(首席执行官)将是2 ....什么?

  8. 原因是,alls目前持有[10,11,13,13,17] ......并且alls.index(ceo)将被评估并在位置2找到13,然后找到其他13位置3。

    那么会发生什么 - 所有人[2]将被分配12 - 该列表又回到之前的内容。

      

    原因是,您使用组合运算符并始终进行评估   新的子表达式没有考虑到,那个子表达式   将在评估过程中发生变化。

         

    您可以通过将某些子表达式的结果分配给,来防止这种情况发生   变量并使用它们而不是使表达式复杂化。   具体来说,可能会在内部发生变化的子表达式   主表达式应该在表达式之前进行评估   存储在变量中。