python中变量和指针的区别_是python变量指针吗?否则他们
是什么?
TLDR:Python名称的作⽤类似于具有⾃动取消引⽤功能的指针,但不允许显式的指针操作。其他⽬标表⽰间接,其⾏为类似于指针。CPython实现在幕后使⽤类型的指针PyObject*。这样,可以将名称语义转换为指针操作。关键是将名称与实际对象分开。
⽰例Python代码同时包含名称(i)和对象(5)。
i = 5 # name `i` refers to object `5`
j = i #
j = 3 # name `j` refers to object `3`
可以将其粗略地翻译为具有单独名称和对象的C代码。
int three=3, five=5; // objects
int *i, *j; // names
i = &five; // name `i` refers to position of object `5`
j = i; // name `j` refers to referent of `i`
j = &three; // name `j` refers to position of object `3`
重要的是,“指针命名”不存储对象!我们没有定义*i = five,但是i = &five。名称和对象彼此独⽴存在。指针变量本身有地址吗
名称仅指向内存中的现有对象。
从名称分配到名称时,不交换任何对象!当我们定义时j = i,它等效于j = &five。既不i也不j被连接到另⼀个。
+- name i -+ -\
\
--> + -+
/ | 5 |
+- name j -+ -/ +----------+
结果,更改⼀个名称的⽬标不会影响另⼀名称。它仅更新特定名称指向的内容。
Python还具有其他类似名称的元素:属性引⽤(i.j),订阅(i[j])和切⽚(i[:j])。与直接引⽤对象的名称不同,所有三个间接引⽤对象的元素。⽰例代码包括名称(i)和预订(i[0])。
i = [1,2,3] # name `i` refers to object `[1, 2, 3]`
j = i # name `j` refers to referent of `i`
i[0] = 5 #
CPython在内部list使⽤CPyObject*指针数组。可以再次将其粗略地翻译为具有单独名称和对象的C代码。
typedef struct{
int *elements[3];
} list; // length 3 `list` type
int one = 1, two = 2, three = 3, five = 5;
list values = {&one, &two, &three}; // objects
list *i, *j; // names
i = &values; // name `i` refers to object `[1, 2, 3]`
j = i; // name `j` refers to referent of `i`
i->elements[0] = &five; // leading element of `i` refers to object `5`
重要的是我们没有更改任何名称!我们确实更改i->elements[0]了我们的名字都指向的对象的元素。现有复合对象的值可以更改。
通过名称更改对象的值时,名称不会更改。双⽅i并j仍指向同⼀个对象,它的值我们可以改变。
+- name i -+ -\
\
--> + -+
/ | elements | --> [1, 2, 3]
+- name j -+ -/ +-----------+
中间对象的⾏为类似于指针,因为我们可以直接更改它指向的对象并从多个名称中引⽤它。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论