如果您要使用C / Java / etc等语言的Python。家庭,它可能会帮助您停止将其a视为“变量”,而开始将其视为“名称”。
a,,b和c不是具有相等值的不同变量;它们是相同名称的不同名称。变量具有类型,身份,地址和类似的东西。
名称没有任何名称。值当然可以,并且对于相同的值,您可以有很多名称。
如果给Notorious B.I.G.热狗,* Biggie Smalls并Chris Wallace有一个热狗。如果将的第一个元素更改a为1,则b和的第一个元素为c1。
如果要知道两个名称是否在命名同一对象,请使用is运算符:
>>> a=b=c=[0,3,5]
>>> a is b
True
然后您问:
有什么不同呢?
d=e=f=3
e=4
print('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 a string!"),但不会影响原来的值,这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热狗。黑帮说唱僵尸永远不要在午夜之后喂饱。