了解python的名称绑定

smi*_*dha 4 python variables

我试图为自己澄清Python的'赋值'给变量的规则.

Python和C++之间的以下比较是否有效?

  1. 在C/C++的声明int a=7装置,存储器被分配用于称为一个整数变量a(在数量LEFT的的=才把值7被存储在它的标志)和.

  2. 在Python语句a=7手段,无名与值7整数对象(在数量RIGHT的侧=)被创建第一和某处存储在存储器中.然后名称a绑定到此对象.

以下C++和Python程序的输出似乎证实了这一点,但我想要一些反馈,我是否正确.

C++为 while abwhile 生成不同的内存位置a,b似乎在Python中引用相同的位置(通过id()函数的输出)

C++代码

#include<iostream>
using namespace std;
int main(void)
{
  int a = 7;
  int b = a; 
  cout << &a <<  "  " << &b << endl; // a and b point to different locations in memory
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:0x7ffff843ecb8 0x7ffff843ecbc

Python:代码

a = 7
b = a
print id(a), ' ' , id(b) # a and b seem to refer to the same location
Run Code Online (Sandbox Code Playgroud)

输出:23093448 23093448

pax*_*blo 7

是的,你基本上是正确的.在Python中,变量名称可以被认为是对值的引用(不是在C++引用方面,尽管它的工作方式类似,更多只是声明它指的是某些东西).

顺便说一句,Python方式与C++非常相似int &b = a,它只是意味着ab引用相同的值.

或者C int *pb = &a,这意味着a并且*pb指的是相同的价值,但是给那些尚未接受C的大脑弯曲的人带来的所有困惑:-)

在Python中分配变量名称使名称引用不同的值,它永远不会复制值本身:

a = 7   # Create "7", make "a" refer to it.
b = a   # make "b" refer to  the "7" as well.
a = 42  # Create "42", make "a" refer to it, b still refers to the "7".
Run Code Online (Sandbox Code Playgroud)

(我说"创造",但不一定如此 - 如果某个价值已存在某个地方,它可能会重复使用它).

在类似C语言中,第二个语句b = a创建一个值,将"7"复制到其中,然后命名b.在Python中,它最终会引用ab引用相同的值.

如果底层数据是不可变的(无法更改),那通常会使Python看起来好像它的行为方式与C的行为相同.

但是,对于可变数据(与使用C中的指针或C++中的引用相同),人们有时会感到惊讶,因为他们没有意识到它背后的价值可能会被共享:

>>> a = [1,2,3] ; print a
[1, 2, 3]

>>> b = a ; print b
[1, 2, 3]

>>> a[1] = 42 ; print a
[1, 42, 3]

>>> print b   #WTH?
[1, 42, 3]
Run Code Online (Sandbox Code Playgroud)

有一些方法可以获得值的独立副本,例如:

b = a[:]
b = [item for item in a]
Run Code Online (Sandbox Code Playgroud)

(这将工作到一个级别,b = a工作到零级别),或者deepcopy如果你想要完全独特,使用到任何级别是必要的.

  • 我对用指针解释Python名称有多种看法。当然,这对已经了解指针的人会有所帮助,但同时也鼓励他们将Python概念转化为他们过时的思维方式,而不是采用Python方式。因此,我更愿意说Python分配最终是一个字典操作:将对象放入以名称为键的字典中。从问题中使用的语言看来,smilingbuddha已经知道了。:) (2认同)