我试图为自己澄清Python的'赋值'给变量的规则.
Python和C++之间的以下比较是否有效?
在C/C++的声明int a=7装置,存储器被分配用于称为一个整数变量a(在数量LEFT的的=才把值7被存储在它的标志)和.
在Python语句a=7手段,无名与值7整数对象(在数量RIGHT的侧=)被创建第一和某处存储在存储器中.然后名称a绑定到此对象.
以下C++和Python程序的输出似乎证实了这一点,但我想要一些反馈,我是否正确.
C++为
while a和bwhile 生成不同的内存位置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
是的,你基本上是正确的.在Python中,变量名称可以被认为是对值的引用(不是在C++引用方面,尽管它的工作方式类似,更多只是声明它指的是某些东西).
顺便说一句,Python方式与C++非常相似
int &b = a,它只是意味着a并b引用相同的值.或者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中,它最终会引用a并b引用相同的值.
如果底层数据是不可变的(无法更改),那通常会使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如果你想要完全独特,使用到任何级别是必要的.