【问题标题】:Python function got 2 lists but only changes 1Python 函数有 2 个列表,但只更改了 1 个
【发布时间】:2015-01-06 18:13:36
【问题描述】:

为什么 Lista1 发生了变化,而 Lista2 却没有?哪些方法直接改变列表?

def altera(L1, L2):
    for elemento in L2:
        L1.append(elemento)
    L2 = L2 + [4]
    L1[1]= 10
    del L2[0]
    return L2[:]

Lista1 = [1, 2, 3]
Lista2 = [1, 2, 3]

Lista3 = altera(Lista1, Lista2)

print(Lista1)
print(Lista2)
print(Lista3)

【问题讨论】:

  • 你到底想做什么?
  • 只是想知道为什么,已经回答了:)

标签: python list methods mutability


【解决方案1】:

L2 = L2 + [4]此语句创建新变量。

如果您将此语句更改为L2.extend([4])L2 += [4],那么它将更改L2 的值,即[2, 3, 4]

在分配之前和之后打印id of L2

>>> L2 = [1,2,3]
>>> id(L2)
3072769420L    # ID of L2 
>>> L2 += [4]
>>> id(L2)
3072769420L    # Same ID of L2
>>> L2
[1, 2, 3, 4]
>>> L2 = L2+[5]
>>> id(L2)
142773548      # New variable which name  is L2

【讨论】:

  • 所以L2 = L2 +[4] != L2 += [2] ?
  • 没错。如果这是所有解决方案中最好的,这可能是有争议的,但事实就是如此。
  • L2 = L2 +[4] != L2 += [4] :两种情况下L2 的值相同。但在L2 = L2 + [4] 语句中,创建了新的L2 变量,在L2 += [4] 语句中,L2 的值已更新。
【解决方案2】:
L2 = L2 + [4]

重新分配 L2 的地址,因此它与传入的列表不同......至少这是简单的解释

您可以通过在分配之前和之后打印id(L2) 来看到这一点

如果你把它改成

L2.append(4)

那么它确实会改变Lista2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2012-03-07
    • 2023-03-20
    • 2020-12-16
    • 2019-08-29
    • 2020-05-16
    相关资源
    最近更新 更多