繁体   English   中英

为什么用 list 操作会给出不同的结果?

[英]Why operating with list gives different results?

所以我正在做雅可比算法来近似方程组的解,我在使用列表时遇到了一些我不明白的事情。 假设我有这三个功能

def func1 (list):
    list_old = list
    list[0] = 99

    print(list_old)
    print(list)

def func2 (list):
    list_old = list.copy()
    list[0] = 99

    print(list_old)
    print(list)

def func3 (list):
    list_old = list
    list = [9,9,9]

    print(list_old)
    print(list)

list = [0,0,0]
func1(list)
func2(list)
func3(list)

Func1 打印

[99, 0, 0] # List_old
[99, 0, 0] # List

Func2 打印

[0, 0, 0] # List_old
[99, 0, 0] # List

Func3 打印

[0, 0, 0] # List_old
[9, 9, 9] # List

所以我的问题是:1)为什么 func1 处的 List[0] 会修改 list_old? 我认为它与指针和内存空间有关,但我不确定,我没有找到任何可以解释这一点的东西。 2) 为什么在 func3 list_old 中没有修改? 不应该和func1一样吗?

@ggorlen 所说的几乎是正确的。 像列表这样的 python 变量的工作方式是它们存储在内存中的特定点。 通过将您的列表变量传递给一个函数,然后修改它,您是在内存中的特定地址修改它,因此即使您离开函数 func1,例如,您修改了原始列表,并且对它的调用也会进行这些修改。

您在 func2 中使用 .copy() 所做的是在内存中的另一个点制作另一个列表。 因此,对此列表的修改不会影响对原始列表的修改,反之亦然(也就是说,func1 中的修改仍将出现在新复制的列表中,因为它们是在复制之前进行的)。

现在,要回答您的问题,func1 中的 list_old 与 func2 中的 list_old 不同,变量名称 list_old 对 func1 和 func2 函数都是本地的,并指向不同的列表。 func1 中的 list_old 指向在函数外的第一行代码中声明的原始列表。 func2 中的 list_old 指向一个新创建的副本,这两个变量是不同的。 在 func3 list_old = list 将 list_old 分配给原始列表,但是你有 list = [9,9,9] 这会创建一个新列表,因此在内存中有一个新地址。所以,func3 中的 list_old 和 list 指向两个内存中的不同位置。

这是一篇关于 python 中变量的好帖子https://medium.com/@tyastropheus/tricky-python-ii-parameter-passing-for-mutable-immutable-objects-10e968cbda35

正如@Dmitry 指出的不变性和可变性,与 Python 中的其他类型不同,列表类型是可变的,这意味着对列表的操作会更改列表本身,而其他不可变对象(如字符串)在操作时会在内存中创建新实例。 下面的代码更好地说明了它:

lstA = [0, 0, 0]
lstB = lstA
print(lstA is lstB) # True
# change list B
lstB[0] = 9
print(lstA is lstB) # keeps True
strA = "A string"
strB = strA
print(strA is strB) # True
# Change strB
srtB[0] = "B" # Ops! item assignment not supported (immutable object)
# Then let's do it in another way
strB = "B" + strA[1:] # strB = "B string"
print(strA is strN) # False (other string was created)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM