[英]How list unpacking works when passed as argument to function with variable parameters?
[英]Modifying a list when unpacking parameters
我最近遇到了一个问题,我需要找到一种优雅的方式来遍历列表,同时拥有可读的代码。 我发现了“拆包”。
假设我有一个列表: l = [ ['param_1', 1] ['param_2',2] ]
我曾经按如下方式遍历此列表:
for param in l:
if param[0] == 'param_1':
param[1] = 27
现在我正在做:
for param_name, param_value in l:
if param_name == 'param_1':
param_value = 27
虽然它更具可读性,但我将 param_value 分配给 27 的事实并没有像以前使用旧方法那样改变我的列表。 知道为什么吗? 在互联网上找不到一些答案。
这就是字典的用途; 您正在尝试更新与字符串param_1
关联的值。
l = [ ['param_1', 1], ['param_2',2] ]
d = dict(l)
# {'param_1': 1, 'param_2': 2}
您现在可以直接设置值,而不是遍历整个列表:
d['param_1'] = 27
# {'param_1': 27, 'param_2': 2}
请注意,这只有在您的参数名称都是唯一的情况下才能正常工作; 相同的名称将全部折叠到同一个字典键中。
您说“在互联网上找不到答案” ,答案确实在字里行间。 但是,在官方文档中,数据模型具有了解正在发生的事情的所有基本要素。 这与对象的可变性和变量名绑定有关。
在第一种情况下,
for param in l:
...
, param
是一个列表。 列表是可变对象,是值可以改变的容器。
当您以您的方式更改param
的值之一时,
param[1] = 27
,您是在告诉 Python 修改param
指向的列表的第二个值。
另一方面,在第二种情况下,
for param_name, param_value in l:
...
,您将l
内的这些列表解压缩为相应的(标量)值对param_name
和param_value
。 它们指向的值是不可变类型(字符串、数字),并且您还“丢失”了指向它们所在的容器/列表的指针(即第一种情况下的param
)。
现在,当您执行param_value = 27
时,Python 实际上是在内存中创建一个新空间来分配27
,而param_value
现在指的是该值,但这是一个不同的变量——同名param_value
但内存中的空间不同。
参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.