Python:如何在通过函数传递全局变量时避免更新全局变量?

时间:2020-05-27 21:33:37

标签: python

下面是我的问题的简化版本:

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”),并且所有结果都相同-更新了“示例”。

4 个答案:

答案 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