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 -+ -/ +-----------+

中间对象的行为类似于指针,因为我们可以直接更改它指向的对象并从多个名称中引用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值