我正在努力为自己澄清Python的分配规则'值 变量。
Python和C ++之间的以下比较是否有效?
在C / C ++中,语句int a=7
表示,内存是为一个名为a
的整数变量({strong> LEFT > {{1} }} 标志)
然后只有值7存储在其中。
在Python中,语句=
表示一个无名整数对象,其值为7({{1> 右侧侧的数量{{1}首先创建并存储在内存中的某个地方。然后名称a=7
绑定到此对象。
以下C ++和Python程序的输出似乎证实了这一点,但我想要一些反馈我是否正确。
C ++为=
和a
生成不同的内存位置
虽然a
和b
似乎在Python中引用了相同的位置
(通过id()函数的输出)
C ++代码
a
输出:0x7ffff843ecb8 0x7ffff843ecbc
Python:代码
b
输出:23093448 23093448
答案 0 :(得分:6)
是的,你基本上是正确的。在Python中,变量名称可以被认为是对值的引用(不是在C ++引用方面,尽管它的工作方式类似,更多只是说它指的是某些东西)。
顺便说一句,Python方式与C ++
int &b = a
非常相似,这意味着a
和b
引用相同的值。或者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中,它最终只有a
和b
引用相同的值。
如果底层数据是不可变的(无法更改),那通常会使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变量