Python中的指针?`x.pointerDest=y.pointerDest`?

2024-10-01 11:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我把我以前的问题分成几个部分,因为这是一个非常混乱的野兽here。这个问题与这个answer和这个answer有关。我试图理解指针,甚至不确定它们是否存在于Python中。

# Won't change x with y=4
>>> x = 0; y = x; y = 4; x
0

# Won't change y
>>> x = 0; y = x; x = 2; y
0

#so how can I change pointers? Do they even exist in Python?
x = 0
y.pointerDestination = x.pointerDestination   #How? By which command?
x = 2
# y should be 0, how?

[更新2:已解决]

也许,关于存在There are no pointers in Python.和{}的矛盾陈述。最后一个是否推断有指向其他内容的指针,从而使第一个语句无效?在


Tags: answerinsoherewithchangedocan
3条回答

Python中没有指针。有一些东西称为引用(它和C++引用一样,通常在指针中实现),但是不同于C++引用并不意味着通过引用。每个变量都存储对分配到其他位置(堆上)的对象的引用。每个集合存储对分配到其他地方的对象的引用。对象的每个成员都存储对分配到其他位置的对象的引用。在

简单表达式x的计算结果是存储在x中的引用,无论使用它的人都无法确定它来自变量。无法获得一个链接到一个变量(与它的内容相反)的链接,该链接可用于跟踪该变量的变化。项(x[y] = ...)和成员(x.y = ...)分配在一个方面是不同的:它们调用方法并对现有对象进行变异,而不是重写局部变量。在处理作用域时,这种差异主要很重要,但是您可以使用其中任何一个来模拟不可变类型的可变性(如@Greg Hewgill所示),并跨函数边界共享状态更改(def f(x): x = 0不会更改任何内容,但是def g(x): x.x = 0可以)。不过,这并不完全取决于模拟按引用传递-除非用包装器对象替换每个变量,该对象的唯一目的是保存可变的val属性。这相当于在C中通过指针模拟按引用传递,但要麻烦得多。在

Python中的标量对象是不可变的。如果使用非标量对象(如列表),可以执行以下操作:

>>> x = [0]
>>> y = x
>>> y[0] = 4
>>> y
[4]
>>> x
[4]
>>> x is y
True

Python没有指向简单标量值的“指针”概念。在

不要混淆引用的指针。他们不是一回事。指针只是指向对象的地址。在python中,您不能真正访问对象的地址,只能访问它们的引用。在

当你把一个对象赋给一个变量时,你就是在给变量分配一个对某个对象的引用。在

x = 0
# x is a reference to an object `0`
y = [0]
# y is a reference to an object `[0]`

python中的一些对象是可变的,这意味着您可以更改对象的属性。其他的是不可变的,这意味着您不能更改对象的属性。在

int(标量对象)是不可变的。一个int的属性没有你可以改变的(又称变异)。在

^{pr2}$

另一方面,list(非标量对象)是可变的。您可以更改列表中的各个元素以引用其他元素。在

y[0] = 20 # changes the 0th element of the list to `20`

在您展示的示例中:

>>> x = [0]
>>> y = [x]

你不是在处理指针,而是在处理对具有特定值的列表的引用。x是一个包含单个整数0的列表。y是一个包含对x所指内容的引用的列表(在本例中,是[0])。在

您可以更改x内容,如下所示:

>>> print(x)
[0]
>>> x[0] = 2
>>> print(x)
[2]

您可以更改xy引用的列表的内容

>>> print(x)
[2]
>>> print(y)
[[2]]
>>> y[0][0] = 5
>>> print(x)
[5]
>>> print(y)
[[5]]

您可以更改y内容以引用其他内容:

>>> print(y)
[[5]]
>>> y[0] = 12345
>>> print(x)
[5]
>>> print(y)
[12345]

它与Java或C等语言的语义基本相同。您不直接使用指向对象的指针(尽管您是间接使用指针,因为实现在幕后使用指针),而是对对象的引用。在

相关问题 更多 >