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

时间:2018-01-21 12:24:31

标签: 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)

format_print(l)

我希望我保持平等l = [5,0,0,0,0,0,0,0,2] 和print_out是[5,'。','。','。','。','。','。','。',2]

现在,他们都是平等的[5,'。','。','。','。','。','。','。',2]

有没有办法实现它?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

复制()

  

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

您可以将copy()功能与will copy list一起使用,而不是将其指向新的var。

import copy
list1 = [1,2,3,4]
# First List
print(id(list1), " is ", list1 )

list2 = list1
# First List
print(id(list2), " is ", list2 )

list3 = copy.copy(list2)
# First List
print(id(list3), " is ", list3 )

地图()

但是,最好在您的示例函数中使用map()来过滤/映射列表中的值。

list1 = [0, 1,2,3,4]
# First List
print(id(list1), " is ", list1 )

def dot(x): 
    return "." if x == 0 else x;

list2 = map(dot, list1);
print(id(list2), " is ", list2 )
print(id(list1), " is ", list1 )

答案 1 :(得分:0)

不要使打印输出等于 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]

正如另一篇文章map所述,这也是一个很好的,更通用的选择

答案 2 :(得分:0)

这就是幕后发生的事情:

  • 您创建一个列表对象[ 5, 0, 0, 0, 0, 0, 0, 0, 2 ]并将其存储在内存中
  • 使用赋值运算符=,将标签l添加到内存中的特定位置
  • 当您执行format_print(l)时,您通过名称l传递内存中特定地点的位置
  • 进入您的函数后,您将新标签problem,然后第三个标签print_out分配给您首次创建的完全相同的对象

在所有这个过程中,只有一个列表存在(即使它现在响应3个不同的名称)。因此,在修改lprint_outproblem时,您需要修改对象的一个​​版本。

一种解决方案是明确创建对象的副本。但是,我认为这可能会很快混淆。如果您开始使用嵌套列表怎么办?你现在也需要担心复制它们。

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

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)

在您的特定情况下,您可以非常简洁:

solution = [v if v != 0 else '.' for v in l]