Python引用如何工作?

Yug*_*dle 5 python reference pass-by-reference pass-by-value

我对Python引用感到困惑.请考虑以下示例:

我的任务:编辑列表中的每个元素

d = { 'm': [1,2,3] }
m = d['m']
m = m[1:]   # m changes its reference to the new sliced list, edits m but not d (I wanted to change d)
Run Code Online (Sandbox Code Playgroud)

同理:

d = { 'm': [1,2,3] }
m = d['m']
m = m[0]    # As per python referencing, m should be pointing to d['m'] and should have edited d
Run Code Online (Sandbox Code Playgroud)

在python中,一切都是通过引用,然后何时创建一个新对象?我们是否始终需要copydeepcopycopy模块制作对象副本?

请澄清.

Eth*_*man 12

在Python中,变量不是包含东西的框,而是指向对象的名称.在你的代码中:

  • d = { 'm': [1,2,3] } - >将名称绑定d到字典
  • m = d['m']- >将名称绑定m到列表
  • m = m[1:]- >将名称绑定m到另一个列表

你的第三条线并没有改变m自己,而是m指向了什么.

要编辑列表中的元素,您可以执行以下操作:

m = d['m']
for i, item in enumerate(m):
    result = do_something_with(item)
    m[i] = result
Run Code Online (Sandbox Code Playgroud)


Mar*_*som 5

Ethan Furman在解释Py​​thon内部工作原理方面表现出色,我不再重复了.

由于m确实代表字典中的列表,因此您可以对其进行修改.你无法将它重新分配给新的东西,这就是当你用=它将它等同于一个新的切片时会发生的事情.

要切掉列表的第一个元素,例如:

>>> m[0:1] = []
>>> d
{'m': [2, 3]}
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢用downvotes驱动,如果我做错了什么我想找出原因.这个答案已在Python 2.7中使用推荐的习语进行了测试:http://docs.python.org/library/stdtypes.html#mutable-sequence-types (4认同)
  • 要从列表中删除项目或切片,我通常更喜欢更明确的`del m [0]`.当然这是一种风格偏好,我不知道为什么会有人投票.我的猜测是,很多看似随机的投票都来自于智能手机的显示太小. (2认同)