我刚刚开始为学校项目学习Python,但我对指针感到困惑。这很奇怪,因为我只是参加了我的大会考试。
所以在这种情况下:
var1 = [0, 1]
var2 = [2, 3]
matrix = [
var1, var2,
var2, var1
]
newVars = [[0, 1], [2, 3]]
如果我这样做:
var1 = newVars[2][:]
var2 = newVars[1][:]
矩阵将保持与以前相同的值。因为vars现在位于一个新地址,但矩阵的值不是。
但很明显,如果我这样做:
var1[:] = newVars[2][:]
var2[:] = newVars[1][:]
它会更改特定内存位置的存储值。
我的问题如下:
答案 0 :(得分:4)
Python 通过引用传递。这意味着当你这样做时:
matrix = [
var1, var2,
var2, var1
]
如果您更改var1
或var2
,则会更改矩阵中的值。矩阵有指向var1
和var2
的指针,并且在python中不可能有纯值。相反,您可以使用list.copy()
获取变量的新副本。另一方面,newVars
与显示的其他值完全无关。但是,当您为var1
或var2
分配新值时,它现在与原始矩阵无关。 (您更改了指向的位置,但没有更改指针的值本身,因此矩阵保留原始值)
列表切片会创建一个新对象。但由于矩阵具有指向原始对象的指针,var1
和var2
只是改变了它们指向的内容,因此矩阵不会改变。它是这样的:
var1 & var2: create a new list and assign its pointer to your self
var1 -> 0x0001
var2 -> 0x0002
matrix: take pointers from var1 and var2 and store it in you.
matrix -> 0x0001, 0x0002.
newVars: create a new list and assign its pointer to your self
newVars -> 0x0004
newVars: create a new list and assign its pointer into your current list (2x)
newVars -> 0x0004: 0x0005, 0x0006
var1 & var2: switch your pointer to a new *copy* of a slice of newVars I have made. (creates new pointers)
var1 -> 0x0007
var2 -> 0x0008
matrix -> 0x0001, 0x0002.
更改0x0001
会更改指向它的指针,更改指针会更改0x0001
,但切片列表会创建新列表。