了解python的名称绑定

时间:2015-01-30 02:53:55

标签: python variables

我正在努力为自己澄清Python的分配规则'值 变量。

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

  1. 在C / C ++中,语句int a=7表示,内存是为一个名为a的整数变量({strong> LEFT > {{1} }} 标志) 然后只有值7存储在其中。

  2. 在Python中,语句=表示一个无名整数对象,其值为7({{1> 右侧侧的数量{{1}首先创建并存储在内存中的某个地方。然后名称a=7绑定到此对象。

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

    C ++为=a生成不同的内存位置 虽然ab似乎在Python中引用了相同的位置 (通过id()函数的输出)

    C ++代码

    a

    输出:0x7ffff843ecb8 0x7ffff843ecbc

    Python:代码

    b

    输出:23093448 23093448

2 个答案:

答案 0 :(得分:6)

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

  

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

     

或者C int *pb = &a,这意味着a*pb指的是同一个值,但是给那些尚未接受大脑的人带来了所有困惑-bendedness of 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".

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

在类C语言中,第二个语句b = a创建 new 值,复制" 7"进入它,然后命名为b。在Python中,它最终只有ab引用相同的值。

如果底层数据是不可变的(无法更改),那通常会使Python看起来像C的行为方式一样。

但是,对于 mutable 数据(与使用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]

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

b = a[:]
b = [item for item in a]

(将在b = a工作到零级别的情况下工作到一个级别),或者如果您希望完全唯一,则使用deepcopy到必要的级别。

答案 1 :(得分:0)

在您的示例代码中," int"是C ++中的内置类型,因此运算符" ="不能超载,但" ="并不总是创建新对象,他们也可以引用同一个对象。 python对象模块有点像Java,大多数对象是引用而不是副本。

你也可以试试这个:

a = 7
b = 7
print id(a), ' ' , id(b) 

它输出相同的结果,因为python会发现a和b都指向同一个const变量