Python 更改列表项

Python change list item

提问人:Zhuang Paulus 提问时间:3/23/2022 更新时间:3/23/2022 访问量:93

问:

我想知道为什么在通过调用函数将值更改为列表时,在以下两种情况下会有这样的差异(将新值分配给列表与将新值分配给 list[:])。我想这与按值调用/按引用调用有关。

法典

def rotate1(nums, k) -> None:   
  nums = nums[-k:]+nums[:-k]
  print(f"In rotate1: {nums}")
  
def rotate2(nums, k) -> None:   
  nums[:] = nums[-k:]+nums[:-k]
  print(f"In rotate2: {nums}")  

ls1 = [1,2,3,4]
rotate1(ls1, 2)
print(f"Outside rotate1: {ls1}\n")

ls2 = [1,2,3,4]
rotate2(ls2, 2)
print(f"Outside rotate2: {ls2}\n")

输出

In rotate1: [3, 4, 1, 2]
Outside rotate1: [1, 2, 3, 4]

In rotate2: [3, 4, 1, 2]
Outside rotate2: [3, 4, 1, 2]

调用 rotate1 后 ls1 值不变; 而 LS2 值在调用 ROTATE2 后发生变化。

Python 列表 函数 语法 按值调用

评论


答:

0赞 LeonardoVaz 3/23/2022 #1

在函数中,您正在分配一个新变量,该变量替换参数中的变量。这不会影响函数外部的列表,因为您正在替换指向值在内存中分配的位置的变量,而您没有更改内存中的值。从本质上讲,您的新列表存储在内存中的新地址中。现在,您的原始列表和新列表已分配在内存中的不同地址中。rotate1numsnums[3, 4, 1, 2]ls1nums

在函数中,您正在更改存储在内存中的值,而不是更改指针。当您使用变量时,变量指向的内存中的值会发生变化。这就是为什么你在外面的列表也会更新。rotate2nums[:]numsnums

评论

0赞 Mark Ransom 3/23/2022
虽然你的答案在技术上是正确的,但谈论内存和指针只会让大多数 Python 用户感到困惑。
0赞 LeonardoVaz 3/23/2022
我认为你是对的,但有一些多样化的答案是件好事,这样他们就可以对问题有更全面的理解。感谢您的反馈。
0赞 Jason Pan 3/23/2022 #2

同样的问题在此页面中得到了确切的解释 Python 是按引用传递还是按值传递?

众所周知,在 Python 中,“对象引用是按值传递的”。

在这两种旋转方法中,都会创建一个新变量以指向对象 [1,2,3,4]。区别在于:nums

  • nums = nums[-k:]+nums[:-k]导致指向新对象。nums
  • nums[:] = nums[-k:]+nums[:-k]导致 Changed 指向的对象。nums

所以,在方法之外,只有真正改变的对象。rotate2ls2