如果您要使用C / Java / etc等语言的Python。家庭,它可能会帮助您停止将其
a视为“变量”,而开始将其视为“名称”。
a,,
b和
c不是具有相等值的不同变量;它们是相同名称的不同名称。变量具有类型,身份,地址和类似的东西。
名称没有任何名称。 值 当然可以,并且对于相同的值,您可以有很多名称。
如果给
Notorious B.I.G.热狗,*
Biggie Smalls并
ChrisWallace有一个热狗。如果将的第一个元素更改
a为1,则
b和的第一个元素为
c1。
如果要知道两个名称是否在命名同一对象,请使用
is运算符:
>>> a=b=c=[0,3,5]>>> a is bTrue
然后您问:
有什么不同呢?
d=e=f=3e=4print('f:',f)print('e:',e)在这里,您将名称重新绑定
e到value
4。这并不影响名称
d和
f以任何方式。
在以前的版本中,您分配给
a[0],而不是
a。因此,从的角度来看
a[0],您正在重新绑定
a[0],但是从的角度来看
a,您正在就位更改它。
您可以使用该
id函数,该函数为您提供代表对象身份的唯一编号,以准确查看哪个对象是哪个对象,即使在
is无济于事的情况下:
>>> a=b=c=[0,3,5]>>> id(a)4473392520>>> id(b)4473392520>>> id(a[0])4297261120>>> id(b[0])4297261120>>> a[0] = 1>>> id(a)4473392520>>> id(b)4473392520>>> id(a[0])4297261216>>> id(b[0])4297261216
请注意,该
a[0]名称已从4297261120更改为4297261216-现在它是另一个值的名称。并且
b[0]现在也是该新值的名称。那是因为
a和
b仍在命名同一对象。
在幕后,
a[0]=1实际上是在列表对象上调用方法。(等效于
a.__setitem__(0, 1)。)因此,它 实际上
根本没有重新绑定任何内容。这就像打电话
my_object.set_something(1)。当然,该对象可能是为了执行此方法而重新绑定实例属性,但这并不重要。重要的是您没有分配任何东西,只是在改变对象。与相同
a[0]=1。
user570826询问:
如果有的话
a = b = c = 10
这与以下情况完全相同
a = b = c = [1, 2, 3]:您有三个名称相同的值。
但是在这种情况下,值是an
int,而
ints是不可变的。在这两种情况下,你可以重新绑定
a到一个不同的值(例如,
a = "Now I'm astring!"),但不会影响原来的值,这
b与
c将仍然是名称。不同的是,有一个列表,你可以更改值
[1, 2, 3]到
[1, 2, 3,4]这样做,例如
a.append(4); 由于那实际上是在更改值
b和
c的名称,
b因此现在b
[1, 2, 3,4]。无法将值更改
10为其他任何值。
10永远是10,就像克劳迪娅(Claudia)一样,吸血鬼也永远是5(至少直到她被Kirsten
Dunst取代)。
*警告:请勿给臭名昭著的BIG热狗。黑帮说唱僵尸永远不要在午夜之后喂饱。



