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