变量在Python中是如何工作的?

变量在Python中是如何工作的?,python,variables,pointers,Python,Variables,Pointers,我刚开始为学校的一个项目学习Python,但我对指针有点困惑。这很奇怪,因为我刚刚通过了组装考试 因此,在这种情况下: var1 = [0, 1] var2 = [2, 3] matrix = [ var1, var2, var2, var1 ] newVars = [[0, 1], [2, 3]] 如果我这样做: var1 = newVars[2][:] var2 = newVars[1][:] var1[:] = newVars[2][:] var2[:] = new

我刚开始为学校的一个项目学习Python,但我对指针有点困惑。这很奇怪,因为我刚刚通过了组装考试

因此,在这种情况下:

var1 = [0, 1]
var2 = [2, 3]

matrix = [
    var1, var2,
    var2, var1
]

newVars = [[0, 1], [2, 3]]
如果我这样做:

var1 = newVars[2][:]
var2 = newVars[1][:]
var1[:] = newVars[2][:]
var2[:] = newVars[1][:]
矩阵将保持与以前相同的值。因为变量现在位于一个新地址,但矩阵的值不是

但很明显,如果我这样做:

var1 = newVars[2][:]
var2 = newVars[1][:]
var1[:] = newVars[2][:]
var2[:] = newVars[1][:]
它将更改特定内存位置的存储值

我的问题如下:

  • 我的结论正确吗
  • 有没有其他方法可以通过更改变量来更改矩阵中的值
  • 关于Python中的变量,还有什么我必须知道的吗

Python是通过引用传递的。这意味着当您执行以下操作时:

matrix = [
    var1, var2,
    var2, var1
]
如果您更改
var1
var2
,则会更改矩阵中的值。矩阵有指向
var1
var2
的指针,在python中不可能有纯值。相反,您可以使用
list.copy()
获取变量的新副本<另一方面,code>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
,但对列表进行切片会创建一个新列表。

从指针的角度考虑确实没有帮助。在Python中,您有指向对象的名称。谢谢您的回答。这澄清了一切。