对于循环迭代,不执行内部条件设置

时间:2017-05-01 20:13:11

标签: python python-2.7 loops iteration

我有一个简单的python循环,遍历一个内部有1000个子列表的2D列表。每个子列表将包含3个字符串值。我只想更改第365个子列表之后的子列表。我还有一个非常简单的条件,它将决定是否将一个操作应用于该元素。我的最小代码如下:

def change_list(arr):
    for i in range(len(arr)):
        if i < 365:
            pass
        else:
            arr[i][1] = str(int(arr[i][1]) * 2)

main中应用此功能时,我只需将此功能调用为:change_list(parsed_lines)。对于已解析的行,我只举一个简单的例子:

parsed_lines = [["afkj","12","234"]] * 1000

我的功能将&#34;乘以2&#34;对所有子列表进行操作,这是一种意外行为。我尝试过不使用条件,但会导致相同的行为。

for i in range(365, len(arr)):
    arr[i][1] = str(int(arr[i][1]) * 2)

然后我尝试用另一种方式迭代我的arr:

for line in arr:
    if arr.index(line) < 365:
        print("I'm less than 365")
    else:
        line[1] = str(int(line[1]) * 2)

但是这次迭代永远不会执行else下的块。我很困惑,希望有人可以提供帮助。

更新

预期的行为应该是:

  1. 对于arr[0: 365],子列表将保持与:[["afkj","12","234"]]
  2. 相同
  3. 对于arr[365:],子列表将为:[["afkj","24","234"]]

1 个答案:

答案 0 :(得分:2)

如上所述,您的问题不在程序中,而是在测试集中。 parsed_lines = [["afkj","12","234"]] * 1000创建一个包含1000个对同一列表["afkj","12","234"]的引用的列表。当通过任何这些引用(例如,365以上)修改它时,它被视为通过任何这些引用进行修改(甚至低于365)。换句话说,parsed_lines[0][0]='foo'会在所有子列表'foo'中生成所有fisrt元素。