在函数中使用参数而不在Python中更改

在函数中使用参数而不在Python中更改,python,variables,attributes,Python,Variables,Attributes,我发现我不能在函数中使用参数而不改变它 例如: l=[ 5, 0, 0, 0, 0, 0, 0, 0, 2 ] def format_print(problem): print_out = problem for i in range(len(print_out)): if print_out[i] == 0: print_out[i] = "." print(print_out) 格式\u打印(l) 我希望l保持相等l=

我发现我不能在函数中使用参数而不改变它

例如:

l=[ 5, 0, 0,   0, 0, 0,   0, 0, 2 ]
def format_print(problem):
    print_out = problem
    for i in range(len(print_out)):
        if print_out[i] == 0:
            print_out[i] = "."
    print(print_out)
格式\u打印(l)

我希望l保持相等l=[5,0,0,0,0,0,0,0,0,2] 并打印成[5,,,,,,,,,,,,,,,,,,2]

现在,它们都相等[5,,,,,,,,,,,,,,,,,2]

有没有办法实施它

提前谢谢你

副本() Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,以便可以在不更改另一个副本的情况下更改一个副本

您可以使用will copy list函数,而不是将其指向新变量

导入副本
列表1=[1,2,3,4]
#第一名单
打印(id(列表1),“是”,列表1)
list2=list1
#第一名单
打印(id(列表2),“是”,列表2)
list3=copy.copy(list2)
#第一名单
打印(id(列表3),“is”,列表3)
地图() 但是,最好在示例中使用函数来过滤/映射列表中的值

list1=[0,1,2,3,4]
#第一名单
打印(id(列表1),“是”,列表1)
def dot(x):
返回“.”如果x==0,则返回其他x;
列表2=地图(点,列表1);
打印(id(列表2),“是”,列表2)
打印(id(列表1),“是”,列表1)

不要使打印输出的等于l(因为您得到的不是新对象,而是对同一对象的引用),请使用另一个列表

l = [ 5, 0, 0, 0, 0, 0, 0, 0, 2 ]
def format_print(problem):
    print_out = []
    for item in problem:
        if item == 0:
            print_out.append(".")
        else:
            print_out.append(item)
    print(print_out)
在任何情况下,您都不需要任何函数,因为您可以通过列表理解来解决问题:

problem = [ 5, 0, 0, 0, 0, 0, 0, 0, 2 ]    
print_out = [item if item !=0 else '.' for item in problem]

正如在另一篇博文中所说的那样,地图也是一个好的、更普遍的选择

这就是幕后发生的事情:

  • 创建一个列表对象
    [5,0,0,0,0,0,0,0,2]
    并将其存储在内存中的某个位置
  • 使用赋值运算符
    =
    ,可以将标签
    l
    添加到内存中的特定位置
  • 当执行
    format\u print(l)
    时,通过名称
    l
    传递内存中该特定点的位置
  • 进入函数后,您将分配一个新标签
    problem
    ,然后将第三个标签
    打印出来
    到您第一次创建的同一对象
在整个过程中,只有一个列表存在(即使它现在响应3个不同的名称)。因此,当您修改
l
打印出
问题
时,您正在修改对象的一个版本

一种解决方案是显式地创建对象的副本。然而,我认为这很快就会令人困惑。如果你开始有嵌套列表呢?你现在也需要担心复制这些

虽然编写函数可能不是最有效的方法,但一般来说,最安全的方法是创建一个全新的列表,在遍历原始列表时填充该列表:

l = [ 5, 0, 0,   0, 0, 0,   0, 0, 2 ]
def format_print(problem):
    solution = [None] * len(problem)
    for i, v in enumerate(problem):
        solution[i] = v if v != 0 else '.'
    print(solution)
在您的特殊情况下,您可以非常简洁:


解决方案=[v if v!=0 else.”对于l中的v]

非常感谢!那真的很有帮助!我可以澄清一件事吗:当我使用命令时:list2=map(点,list1);打印(id(列表2),“是”,列表2)。我得到的2170386381512是列表2。但我怎样才能得到带值的实际列表,而不是带地址的映射对象呢?您可以将结果包装到list
list(map(dot,list1))