我不知道如果不改变它就不能在函数中使用参数。
例如:
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]
有没有办法实现它?
提前谢谢!
答案 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个不同的名称)。因此,在修改l
,print_out
或problem
时,您需要修改对象的一个版本。
一种解决方案是明确创建对象的副本。但是,我认为这可能会很快混淆。如果您开始使用嵌套列表怎么办?你现在也需要担心复制它们。
虽然编写函数可能不是最有效的,但最安全的方法是创建一个全新的列表,您将在遍历原始列表时填充该列表:
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]