如果您要使用C / Java / etc等语言的Python。家庭,它可能会帮助您停止将其a
视为“变量”,而开始将其视为“名称”。
a
,,b
和c
不是具有相等值的不同变量;它们是相同名称的不同名称。变量具有类型,身份,地址和类似的东西。
名称没有任何名称。 值 当然可以,并且对于相同的值,您可以有很多名称。
如果给NotorIoUs B.I.G.
热狗,*Biggie Smalls
并Chris Wallace
有一个热狗。如果将的第一个元素更改a
为1,则b
和的第一个元素为c
1。
如果要知道两个名称是否在命名同一对象,请使用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
,而int
s是不可变的。在这两种情况下,你可以重新绑定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热狗。黑帮说唱僵尸永远不要在午夜之后喂饱。