Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;蟒蛇的;就地替换列表中一个或多个项目的方法_Python_Python 2.7_List - Fatal编程技术网

Python &引用;蟒蛇的;就地替换列表中一个或多个项目的方法

Python &引用;蟒蛇的;就地替换列表中一个或多个项目的方法,python,python-2.7,list,Python,Python 2.7,List,我想就地替换列表中的一个或多个项目。我的直觉反应是这样的: mylist = [...] other_object = dict(spam='eggs', a_list=mylist) def replacer(item): ... contents not shown, returns a replacement ... mylist[:] = [replacer(item) for item in mylist] 它需要放在适当的位置,这样,如果我有其他对象(例如上面示例中的ot

我想就地替换列表中的一个或多个项目。我的直觉反应是这样的:

mylist = [...]
other_object = dict(spam='eggs', a_list=mylist)

def replacer(item):
   ... contents not shown, returns a replacement ...

mylist[:] = [replacer(item) for item in mylist]
它需要放在适当的位置,这样,如果我有其他对象(例如上面示例中的
other_object
)引用mylist,那么这些其他对象将看到更新的值。(澄清:我不想要求对
其他对象
进行任何更改,因为它是在我维护的代码的其他地方进行管理的。)


这是Python中最惯用的方法吗?如果没有,还有更好的方法吗?

我觉得你自己的解决方案很好:

mylist[:] = [replacer(item) for item in mylist]
或者,您可以用更明确但冗长的方式:

for idx, val in enumerate(mylist):
    mylist[idx] = replacer(val)

我可以想象很多其他的方法,但是如果我建议他们你可以直接这么做,我会被烧死并被禁止下地狱:

>>> my_list=[1,2,3]
>>> other_obj={'eggs':my_list}
>>> my_other_list=[[1,2,3],my_list]
>>> other_obj['eggs'][:]=[e+2 for e in other_obj['eggs']]
>>> other_obj
{'eggs': [3, 4, 5]}
>>> my_other_list
[[1, 2, 3], [3, 4, 5]]
>>> my_list
[3, 4, 5]
请注意,在使用原始
my_list
的任何位置,都会通过对这些名称中的任何一个使用切片指定来更改它:

>>> my_other_list[1][:]=[20,30,40]
>>> my_list
[20, 30, 40]
>>> other_obj
{'eggs': [20, 30, 40]}
更多关于Ned Batchelder的信息:


根据您的编辑:只需原地更改
mylist
,它将在使用
mylist
的其他对象中更改(但不是
mylist
的副本)。您可以使用任何进行就地修改的方法

例如:

>>> my_list[:]=['new','inserted','items']
其他两个对象也会发生变化:

>>> other_obj
{'eggs': ['new', 'inserted', 'items']}
>>> my_other_list
[[1, 2, 3], ['new', 'inserted', 'items']]

如果这些是“共享”对象,请小心,因为其他程序/进程可能会在您不知情的情况下更改名称引用。潜在的潜在漏洞。

惯用的方法是不就地执行,而是返回一个新对象,您可以将其传递给关心它的对象。不,这是功能性的方法,而不是惯用的方法,我很想这样做,但在这种情况下我不能。mylist=[replacer(item)for item in mylist]为列表定义一个非常小的
包装器怎么样?然后,您可以运行类似于
mylist.replace(function=replacer)
的方法,并相应地更改
self.lst
属性。如何
[mylist.\uuuu setitem\uuuuuu(i,replacer(item))for i,item in enumerate(mylist)]
?这两种方法都不会更新
其他对象
,像OP request一样。@not_a_robot这些方法改变了列表,
other_object
包含的列表。代码不必触碰
other\u object
,更改就可以反映在那里。@not\u-robot为什么这么说?@not\u-robot正在创建一个新列表并将其分配给名称
mylist
,而不是修改
mylist
other\u object['alist']
引用的原始列表。当你有疑问的时候,总是选择最可读的方式,如果你还在犹豫的话,就重读一遍