现在我知道在迭代循环期间修改列表是不安全的。但是,假设我有一个字符串列表,我想剥离字符串本身。替换可变值算作修改吗?


相关问题请参见for循环中python变量的作用域:给迭代变量赋值不会修改底层序列,也不会影响未来的迭代。


当前回答

你可以这样做:

a = [1,2,3,4,5]
b = [i**2 for i in a]

它被称为列表理解,让你更容易在列表中循环。

其他回答

在迭代列表时修改每个元素是可以的,只要不更改列表中的添加/删除元素。

你可以使用列表推导式:

l = ['a', ' list', 'of ', ' string ']
l = [item.strip() for item in l]

或者只做c风格的for循环:

for index, item in enumerate(l):
    l[index] = item.strip()

我刚刚发现的一些东西-当循环遍历一个可变类型列表(比如字典)时,你可以使用一个正常的for循环,像这样:

l = [{"n": 1}, {"n": 2}]
for d in l:
    d["n"] += 1
print(l)
# prints [{"n": 2}, {"n": 1}]

Ignacio Vazquez-Abrams给出的答案非常好。这个例子可以进一步说明。想象一下:

给出了一个包含两个向量的列表。 您希望遍历列表并反转每个数组的顺序。

假设你有:

v = np.array([1,2,3,4])
b = np.array([3,4,6])

for i in [v, b]:
    i = i[::-1]   # This command does not reverse the string.

print([v,b])

你会得到:

[array([1, 2, 3, 4]), array([3, 4, 6])]

另一方面,如果你这样做:

v = np.array([1,2,3,4])
b = np.array([3,4,6])

for i in [v, b]:
   i[:] = i[::-1]   # This command reverses the string.

print([v,b])

结果是:

[array([4, 3, 2, 1]), array([6, 4, 3])]

这被认为是糟糕的形式。如果需要保留对列表的现有引用,则使用列表理解式,并使用切片赋值。

a = [1, 3, 5]
b = a
a[:] = [x + 2 for x in a]
print(b)

不,你不会改变列表的“内容”,如果你可以这样改变字符串。但在Python中,它们是不可变的。任何字符串操作都会返回一个新字符串。

如果你有一个对象列表,你知道是可变的,你可以这样做,只要你不改变列表的实际内容。

因此,您将需要做某种类型的映射。如果你使用生成器表达式,它[操作]将在你迭代时完成,你将节省内存。