Python 为什么函数允许全局变量的变异而不返回它?

Python 为什么函数允许全局变量的变异而不返回它?,python,function,scope,Python,Function,Scope,我有一个关于Python中变量作用域的问题。为什么在不返回变异变量的情况下允许对变量进行变异 def mutation(L): L.append("x") L = [] mutation(L) print(L) 我希望打印[],因为函数中L的突变只影响局部范围。为什么“L”即使在全局范围内也会发生变异?这是因为您实际上正在更改传递到函数中的原始列表/对象。请注意,基本原理是按对象引用传递。因此,对函数内传递的参数的更改将反映外部 如果您不想全局更改,请使用[:]创建一个副本,这样可以

我有一个关于Python中变量作用域的问题。为什么在不返回变异变量的情况下允许对变量进行变异

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

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

我希望打印[],因为函数中L的突变只影响局部范围。为什么“L”即使在全局范围内也会发生变异?

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

如果您不想全局更改,请使用
[:]
创建一个副本,这样可以在不改变原始列表的情况下对副本执行操作

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

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

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

如果您不想全局更改,请使用
[:]
创建一个副本,这样可以在不改变原始列表的情况下对副本执行操作

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

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

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

向函数发送副本:

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

L = []
mutation(list(L))
print(L)
# Prints out []
def mutation(L):
    L = list(L)
    L.append("x")

L = []
mutation(L)
print(L)
# Prints out []
在函数内部制作副本:

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

L = []
mutation(list(L))
print(L)
# Prints out []
def mutation(L):
    L = list(L)
    L.append("x")

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

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

向函数发送副本:

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

L = []
mutation(list(L))
print(L)
# Prints out []
def mutation(L):
    L = list(L)
    L.append("x")

L = []
mutation(L)
print(L)
# Prints out []
在函数内部制作副本:

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

L = []
mutation(list(L))
print(L)
# Prints out []
def mutation(L):
    L = list(L)
    L.append("x")

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