我有一个简单的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
下的块。我很困惑,希望有人可以提供帮助。
更新
预期的行为应该是:
arr[0: 365]
,子列表将保持与:[["afkj","12","234"]]
arr[365:]
,子列表将为:[["afkj","24","234"]]
答案 0 :(得分:2)
如上所述,您的问题不在程序中,而是在测试集中。 parsed_lines = [["afkj","12","234"]] * 1000
创建一个包含1000个对同一列表["afkj","12","234"]
的引用的列表。当通过任何这些引用(例如,365以上)修改它时,它被视为通过任何这些引用进行修改(甚至低于365)。换句话说,parsed_lines[0][0]='foo'
会在所有子列表'foo'
中生成所有fisrt元素。