为什么函数允许在不返回全局变量的情况下对其进行突变?

时间:2018-10-21 15:55:41

标签: python function scope

我有一个关于Python变量范围的问题。为什么在不返回变异变量的情况下允许变量变异?

let filtered = visibleGroceries.filter(
  g =>
    g.currentState.toString() === State[State.OnShoppingListUnchecked]
);

我希望它能打印出[],因为函数内部L的突变仅影响局部作用域。为什么即使在全局范围内,“ L”也会发生突变?

2 个答案:

答案 0 :(得分:0)

这是因为您实际上是在更改传递给函数的原始列表/对象。请注意,基本原理是通过对象引用。因此,对函数中传递的参数所做的更改将反映在外部。

如果您不想全局更改,请使用[:]创建副本,这将对副本执行操作而不会更改原始列表。

def mutation(L):
    L = L[:]
    L.append("x")

L = []
mutation(L)
print(L)
# []

答案 1 :(得分:0)

由于Python是按对象引用传递的,因此当您将某些内容传递给函数时,它指向内存中可以操纵的同一对象。如果希望某个函数不修改原始列表,则在将其传递给该函数或在函数本身内部时,需要对其进行复制。

将副本发送到函数:

<android.support.v7.widget.Toolbar

在函数内部制作副本:

def mutation(L):
    L.append("x")

L = []
mutation(list(L))
print(L)
# Prints out []