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

3

我刚开始学习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][:]

这将会改变特定内存位置上的存储值。

我的问题如下:

  • 我的结论正确吗?
  • 除了改变变量,我还有其他方法来改变矩阵中的值吗?
  • 在Python中的变量,还有其他需要注意的地方吗?

4
在Python中,以指针的方式思考并不会有所帮助。相反,你可以使用名称来指向对象。 - Daniel Roseman
1个回答

4

Python 是按引用传递的。这意味着当你执行以下代码时:

matrix = [
    var1, var2,
    var2, var1
]

当你更改var1var2,它会更改矩阵中的值。矩阵有指向var1var2的指针,在Python中无法使用纯值。相反,您可以使用list.copy()来获取变量的新副本。另一方面,newVars与其他显示的值完全无关。但是当您为var1var2分配一个新值时,它现在与原始矩阵无关。 (您更改了其指向的位置,但未更改指针本身的值,因此矩阵保留了原始值)
对列表切片会创建一个新对象。但由于矩阵具有指向原始对象的指针,并且var1var2只是更改了它们指向的位置,因此矩阵不会更改。就像这样:
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,但是切片列表会创建一个新列表。


谢谢你的回答。这解释了一切。 - Nergal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接