在函数中使用参数而不在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
到您第一次创建的同一对象打印出来
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。但我怎样才能得到带值的实际列表,而不是带地址的映射对象呢?您可以将结果包装到listlist(map(dot,list1))