【问题标题】:Python - Why this list doesn't changePython - 为什么这个列表没有改变
【发布时间】:2022-12-17 23:58:06
【问题描述】:

我想更改列表的一部分并保存结果。 我想知道为什么这种方法不起作用。 谢谢!

代码:
def Test(L):
    for i in range(len(L)):
        L[i] = L[i][1:]

L = ["-stackoverflow", "-Python", "-C++"]
Test(L[1:])
print(L)
输出:

['-stackoverflow', '-Python', '-C++']

预期的:

['-stackoverflow', 'Python', 'C++']

【问题讨论】:

  • 您的函数需要返回修改后的列表并在调用者处重新分配它。

标签: python list function


【解决方案1】:

您使用 L[1:] 调用 Test() 函数,但这只是列表的副本,而不是原始的 L 列表。所以当你在你的函数中修改列表时,你修改了副本。

【讨论】:

    【解决方案2】:

    您的函数需要返回修改后的列表并在调用者处重新分配它。

    def Test(L):
        for i in range(len(L)):
            L[i] = L[i][1:]
        return L
    
    L = ["-stackoverflow", "-Python", "-C++"]
    L = Test(L[1:])
    print(L)
    

    【讨论】:

      【解决方案3】:

      每当您在列表中使用 [:] 时,它都会构建一个新列表。当你调用Test(L[1:])时,你没有传递给它L,而是一个与L无关的全新列表。您可以在这里做两件事:返回新列表以进行重新分配,或者将 L 传递给 Test() 而不是 L[1:]

      【讨论】:

      • “与 L 无关的全新列表”- 不完全是:字符串仍然是相同的实例。如果 OP 会改变 L[i] 而不是分配给它,那么它就会起作用。
      【解决方案4】:

      您只需要编写 Test(L) 而不是 Test(L[1:]) ,因为该函数已经为您执行了操作。

       def Test(L):
      for i in range(len(L)):
          L[i] = L[i][1:]
      
      L = ["-stackoverflow", "-Python", "-C++"]
      
      Test(L)
      print(L)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-11
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        相关资源
        最近更新 更多