我把我以前的问题分成几个部分,因为这是一个非常混乱的野兽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.
和{
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中的标量对象是不可变的。如果使用非标量对象(如列表),可以执行以下操作:
Python没有指向简单标量值的“指针”概念。在
不要混淆引用的指针。他们不是一回事。指针只是指向对象的地址。在python中,您不能真正访问对象的地址,只能访问它们的引用。在
当你把一个对象赋给一个变量时,你就是在给变量分配一个对某个对象的引用。在
python中的一些对象是可变的,这意味着您可以更改对象的属性。其他的是不可变的,这意味着您不能更改对象的属性。在
^{pr2}$int
(标量对象)是不可变的。一个int
的属性没有你可以改变的(又称变异)。在另一方面,
list
(非标量对象)是可变的。您可以更改列表中的各个元素以引用其他元素。在在您展示的示例中:
你不是在处理指针,而是在处理对具有特定值的列表的引用。
x
是一个包含单个整数0
的列表。y
是一个包含对x
所指内容的引用的列表(在本例中,是[0]
)。在您可以更改
x
的内容,如下所示:您可以更改
x
到y
引用的列表的内容:您可以更改
y
的内容以引用其他内容:它与Java或C等语言的语义基本相同。您不直接使用指向对象的指针(尽管您是间接使用指针,因为实现在幕后使用指针),而是对对象的引用。在
相关问题 更多 >
编程相关推荐