gpt4 book ai didi

python - 在 Python 中,如果我输入 a=1 b=2 c=a c=b,那么 c 的值是多少? c 指向什么?

转载 作者:太空狗 更新时间:2023-10-29 21:14:02 26 4
gpt4 key购买 nike

Python 变量在大多数情况下确实很容易理解,但有一种情况我一直在努力解决。如果我想将我的变量指向一个新的内存地址,我该怎么做?或者,如果 Python 默认执行此操作(将变量视为指针),那么我如何从字面上将新变量的值分配给旧变量的内存地址?

例如,如果我输入

a=1
b=2
c=a
c=b

c 的值是多少?它指向什么?该语句是将指针 c -> a 替换为指针 c -> b 还是从 b 中获取值并覆盖 ab 的值? c=b 有歧义。

换句话说,如果你从这里开始:

a -> 1 <- c
b -> 2

是不是像这样重新指向c:

a -> 1    _c
b -> 2 <-/

或者像这样复制b

a -> 2 <- c
b -> 2

最佳答案

Python 中没有指向变量的指针。特别是,当你这样说时:

Is the statement replacing the pointer c -> a with pointer c -> b...

Python 没有任何诸如“指针 c -> a”之类的东西,所以它没有这样做。

...or grabbing the value from b and overwriting a with b's value

但是a没有赋值,所以它也没有这样做。

相反,Python 保留一个符号表1 映射每个名称(abc、等)指向一个对象的指针。在你的代码示例中,在你分配给 ab 之后,它看起来像这样(显然我已经弥补了内存地址):

a -> 0xfffa9600 -> 1
b -> 0xfffa9608 -> 2

然后在您分配 c = a 之后,它看起来像这样:

a -> 0xfffa9600 -> 1
b -> 0xfffa9608 -> 2
c -> 0xfffa9600 -> 1

注意 c 完全独立于 a。当您运行 c = b 时,它会将符号表中与 c 关联的指针替换为与 b 关联的指针,但是 a 不受影响:

a -> 0xfffa9600 -> 1
b -> 0xfffa9608 -> 2
c -> 0xfffa9608 -> 2

在这种情况下,这几乎就是它的全部内容,因为所讨论的对象,即整数常量 12 是不可变的。但是,如果您使用可变对象,从某种意义上说,当对象存储在一个变量中时,对对象的更改会反射(reflect)在引用同一对象的其他变量中,因此它们确实开始有点像指针。例如,考虑这个代码示例:

x = {'a': 1, 'b': 2}
y = x

在这里,符号表可能看起来像这样:

x -> 0xffdc1040 -> {'a': 1, 'b': 2}
y -> 0xffdc1040 -> {'a': 1, 'b': 2}

如果你现在运行

y['b'] = y['a']

然后它实际上并没有改变符号表中与 y 关联的指针,但它确实改变了该指针指向的对象,所以你结束了

x -> 0xffdc1040 -> {'a': 1, 'b': 1}
y -> 0xffdc1040 -> {'a': 1, 'b': 1}

并且您会看到您对 y['b'] 的分配也影响了 x。对比一下

y = {'a': 1, 'b': 2}

这实际上使 y 指向一个完全不同的对象,并且更类似于您之前使用 ab 所做的事情,和 c


1实际上有几个符号表,对应于不同的范围,Python 有一个检查它们的顺序,但这个细节在这里不是特别相关。

关于python - 在 Python 中,如果我输入 a=1 b=2 c=a c=b,那么 c 的值是多少? c 指向什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com