下面是我的问题的简化版本:
example =[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
def func(data):
data[0][0:6] = [1, 1, 1, 1, 1]
data[1][0:6] = [1, 1, 1, 1, 1]
return data
print(example)
func(example)
print(example)
并具有输出:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
我期望的输出是:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
如何避免在运行“ func”后更新全局变量“ example”?我尝试了一个数字占位符变量组合(内部和外部“ func”),并且所有结果都相同-更新了“示例”。
答案 0 :(得分:1)
虽然应该避免使用全局变量,但如果绝对需要执行上述操作,请使用deepcopy()
:
from copy import deepcopy
example =[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
def func(data):
data = deepcopy(data)
data[0][0:6] = [1, 1, 1, 1, 1]
data[1][0:6] = [1, 1, 1, 1, 1]
return data
print(example)
func(example)
print(example)
答案 1 :(得分:0)
尝试使用深度复制:
import copy
example =[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
def func(data):
data[0][0:6] = [1, 1, 1, 1, 1]
data[1][0:6] = [1, 1, 1, 1, 1]
return data
print(example)
func(copy.deepcopy(example))
print(example)
答案 2 :(得分:0)
由于列表是可变的,因此它们基本上是通过引用func
传递的。如果您想对该对象执行其他操作,则需要显式地制作这样的副本(其他答案也一样,但是对于您的情况,您可能希望在函数中使用 ):>
import copy
example =[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
def func(data):
localdata = copy.deepcopy(data). ## or data.copy() or copy.copy(data)
localdata[0][0:6] = [1, 1, 1, 1, 1]
localdata[1][0:6] = [1, 1, 1, 1, 1]
return localdata
print(example)
newexample = func(example)
print(example)
您是否要copy.copy(data)
或copy.deepcopy(data)
或data.copy()
depends on what you know about the input。
请注意,您的原始代码不会将其return
用于任何事情...
答案 3 :(得分:0)
您需要为此制作一个副本。而且由于example
是列表列表,所以您必须使用copy.deepcopy()
或列表理解,如下所示:
example =[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
def func(data):
dataCopy = [sublist.copy() for sublist in data]
dataCopy[0][0:6] = [1, 1, 1, 1, 1]
dataCopy[1][0:6] = [1, 1, 1, 1, 1]
return dataCopy
print(example) # all 0's
func(example)
print(example) # still all 0's
print(func(example)) # all 1's