我有一个关于Python变量范围的问题。为什么在不返回变异变量的情况下允许变量变异?
let filtered = visibleGroceries.filter(
g =>
g.currentState.toString() === State[State.OnShoppingListUnchecked]
);
我希望它能打印出[],因为函数内部L的突变仅影响局部作用域。为什么即使在全局范围内,“ L”也会发生突变?
答案 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 []