在 python 中使用 for 循环连接字符串以列出项目

Concatinating strings to list items using for loops in python

我是 python3 的新手,最近我一直在练习列表和函数。

在这里,我将字符串存储在一个列表中,然后将该列表传递给一个应该 concatenate/add 字符串的函数,如下所示:

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
    return names


liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = hello(liiist)
print(liiist)

但不是得到 ['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!'],我只是得到 ['L Lawliet', 'Nate River', 'Mihael Keehl'] 什么都没发生。此外,PyCharm 提醒我 Local variable 'name' value is not used

我也试验过这个问题,结果在函数之外也不起作用:

vars = ["trying", "to", "rewrite", "lists"]
for var in vars:
    var = var + " hello"
print(vars)

输出:['trying', 'to', 'rewrite', 'lists']

我已经找到了解决这个问题的方法,但我很不高兴我只是通过 chance/massive 大量的反复试验找到了解决方案。 我想我不明白为什么 python 产生这样的结果可能会影响我以后的职业生涯。 有人可以解释为什么会这样吗?

此外,如果您好奇,这是我找到的解决方法:

def hello(names):
    counter = 0
    for name in names:
        name = name + " the Great"
        names[counter] = names
        counter += 1
    return names

names = ["L Lawliet", "Nate River", "Mihael Keehl"]
names = hello(names)
print(names)

给我一个比上面的代码更有效的代码也可以帮助:)

你的函数

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
    return names

什么都不做,因为 Python 中的字符串是不可变的。一种解决方案是 return 包含新创建的字符串的新列表,例如:

def hello(names):
    rv = []
    for name in names:
        rv.append("Hello "+name+"!")
    return rv


liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = hello(liiist)
print(liiist)

打印:

['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!']

或者您可以更改列表 in-place(但在这种情况下,您的函数不会 return 任何内容):

def hello(names):
    for i, name in enumerate(names):
        names[i] = "Hello "+name+"!"

liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]

hello(liiist)
print(liiist)

打印:

['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!']

获得上述输出的一种方法是按照@Andrej Kesely 提到的附加到列表。另一种方法是使用 'yield' 生成器输出序列。参考下面的代码。

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
        yield name     # generator that outputs sequence. Yield should be inside loop

liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = list(hello(liiist))     # store the yield output in a list when calling the function
print(liiist)

参考下面的输出截图