这些变量赋值按照我的预期工作:
>>> a = 3
>>> b = a
>>> print(a, b)
(3, 3)
>>> b=4
>>> print(a, b)
(3, 4)
但是,这些赋值的行为是不同的:
>>> class number():
... def __init__(self, name, number):
... self.name = name
... self.number = number
...
>>> c = number("one", 1)
>>> d = c
>>> print(c.number, d.number)
(1, 1)
>>> d.number = 2
>>> print(c.number, d.number)
(2, 2)
为什么c
和d
是一样的,而不是在(a, b)
示例中?如何在(c, d)
类示例中执行类似于(a, b)
的操作?也就是说,复制对象,然后更改其中的一部分(这不会影响我从中借用属性的对象)?
发布于 2015-04-29 02:10:29
我没有看到任何人提供了关于如何通过复制对象来使这两种情况相同的细节,而不仅仅是将新的引用分配给相同的对象。
import copy
c = number("one", 1)
d = c
e = copy.copy(c)
print(c.number, d.number, e.number)
d.number = 2
e.number = 5
print(c.number, d.number, e.number)
这将为您提供:
1 1 1
2 2 5
发布于 2015-04-29 02:00:21
这一点在其他答案中没有得到澄清,但如果我没记错的话,python中的整数实际上并不是原语。它们是不可变的整数对象。因此,当您有多个变量都包含值3时,实际上您有多个对Integer实例的引用,该实例包含值3。
因此,记住这一点;
a = 3
b = a
导致变量a和b各自指向保持值3的整数。同样,
c = number("one", 1)
d = c
产生变量c和d,每个变量指向number的相同实例。
同样的事情也会发生在
b = 4
现在b是对Integer 4的引用。
但是,当设置了d.number时
d.number = 2
由c和d指向的类"number“的实例的成员变量"number”被更新为引用Integer 2。这里的重要概念是,您正在修改由两个单独变量引用的对象的成员变量。
资料来源:http://www.laurentluce.com/posts/python-integer-objects-implementation/
https://stackoverflow.com/questions/29926485
复制相似问题