【发布时间】:2020-02-01 18:01:06
【问题描述】:
所以我正在使用 Jacobi 算法来近似方程组的解,并且在使用列表时遇到了一些我不理解的事情。 假设我有这三个功能
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一样吗?
【问题讨论】:
-
命名变量
list会覆盖内置函数。func1有两个变量指向同一个内存位置。func2显然做了一个副本,两个不同的变量指向不同的内存位置。func3将list重新分配到新的内存位置,但list_old仍指向原始的list位置,因此不会发生混叠。 -
阅读关于可变和不可变python类型的信息medium.com/@meghamohan/…